Javascript闭包

Javascript闭包,javascript,closures,Javascript,Closures,我正在试验Javascript闭包,下面的代码总是打印9。但是,当我创建10个闭包时,前面的值不应该保持不变吗 var arr = []; function getModule(value){ return (function (_value) { var m_val = _value; this.getValue = function () { return m_val;

我正在试验Javascript闭包,下面的代码总是打印9。但是,当我创建10个闭包时,前面的值不应该保持不变吗

var arr = [];
function getModule(value){
        return (function (_value) {
              var m_val = _value;

              this.getValue = function () {
                  return m_val;
              };

              return {
                ShowValue: function () {
                    console.log(getValue.call(this));
                }
              };
        })(value);
}
for(var i = 0; i < 10 ; i++){
    arr.push(getModule(i))
}
for(var i = 0; i < 10 ; i++){
    arr[i].ShowValue();
}
var arr=[];
函数getModule(值){
返回(函数(_值){
var m_val=_值;
this.getValue=函数(){
返回m_val;
};
返回{
ShowValue:函数(){
log(getValue.call(this));
}
};
})(价值);
}
对于(变量i=0;i<10;i++){
arr.push(获取模块(i))
}
对于(变量i=0;i<10;i++){
arr[i].ShowValue();
}
请帮助理解这种奇怪的行为

但当我创建10个闭包时,前面的闭包不应该继续存在吗

var arr = [];
function getModule(value){
        return (function (_value) {
              var m_val = _value;

              this.getValue = function () {
                  return m_val;
              };

              return {
                ShowValue: function () {
                    console.log(getValue.call(this));
                }
              };
        })(value);
}
for(var i = 0; i < 10 ; i++){
    arr.push(getModule(i))
}
for(var i = 0; i < 10 ; i++){
    arr[i].ShowValue();
}
您正在创建它们,但随后立即用下一个覆盖它们
匿名函数中的此
是对全局对象的引用(在浏览器上也可用作
窗口
),因此每个
this.getValue=…
都会覆盖前面的对象。它引用全局对象的原因是,调用该函数的方式没有设置任何特定的
this
,因此它默认为全局对象(这是一种“严格”的模式更改;请参阅下文)。有关此如何在中工作的详细信息

只需使用函数声明,而不是分配给this的
属性:

function getValue() {
    return m_val;
}
还请注意,调用时没有理由设置此
,因此:

console.log(getValue.call(this));
变成

console.log(getValue());
实例:

var arr=[];
函数getModule(值){
返回(函数(_值){
var m_val=_值;
函数getValue(){
返回m_val;
}
返回{
ShowValue:函数(){
log(getValue());
}
};
})(价值);
}
对于(变量i=0;i<10;i++){
arr.push(获取模块(i))
}
对于(变量i=0;i<10;i++){
arr[i].ShowValue();
}
。作为控制台包装器{
最大高度:100%!重要;

}
我还建议OP将
“使用严格的”
放在代码的顶部。这会使代码的问题变得更加明显。@MikaelLennholm:…而且它在99.9999%的时间里都是好建议。:-)完成。