Javascript闭包
我正在试验Javascript闭包,下面的代码总是打印9。但是,当我创建10个闭包时,前面的值不应该保持不变吗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;
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%的时间里都是好建议。:-)完成。