[英]javascript anonymous function scope behavior
我有一个遵循这种模式的代码:
a = "abcdefghijklmnopqrstuvwxyz";
m = {};
for(i=0;i<10;i++){
m[a.charAt(i)] = function(){
return i;
};
}
console.log(m.c());
它返回10。
为什么这样做呢? 而我怎样才能得到它返回相应的数字呢?
-------编辑-------
感谢您的好评。 到目前为止,提供的答案适用于上面的示例,但是我忘了提及我需要传递一个回调函数。 考虑到您的建议,我想到了这一点:
a = "abcdefghijklmnopqrstuvwxyz";
m = {};
f = function(i) {
return function(){
return i;
}
}
for(i=0;i<10;i++){
var eval('n') = "hi";
console.log(n);
m[a.charAt(i)] = function(fn){
fn(f(i));
};
}
m.c(function(a){console.log(a);});
结果符合我的直觉,即它不起作用。 有没有人对此有任何想法?
谢谢你的帮助
由于您的帮助,我得以启动了这个项目: https : //github.com/sbussard/python-for-node
请随时继续为您做出贡献。
在不更改变量的情况下将其笼中循环。
不良行为
> myFunctions = new Array()
[object Array]
for(var i = 0; i < 3; ++i) myFunctions[i] = function() { return i; }
> myFunctions[0]()
3
> myFunctions[1]()
3
> myFunctions[2]()
3
固定
>myFunctions = new Array()
[object Array]
function mkFunctionWithCagedValue(value) {
return function() {
return value;
};
}
> for(var i = 0; i < 3; ++i) myFunctions[i] = mkFunctionWithCagedValue(i)
[object Function]
> myFunctions[0]()
0
> myFunctions[1]()
1
> myFunctions[2]()
2
该函数引用变量i
。 在执行该函数时(在console.log()
行),它将打印变量,该变量当时的值为10
。
要解决此问题,您需要在每次迭代中创建一个新变量,并为其分配i
的当前值。 要在每次迭代中获得新的变量作用域,可以使用其他函数:
for(i=0;i<10;i++){
function use_copy() {
var icopy = i; # a new variable to hold the value of i
return (function(){
# original function, now using icopy
return icopy;
});
}
m[a.charAt(i)] = use_copy();
}
** 编辑 **
调用mc()
,循环内的变量i
等于10
,并且由于该变量已在函数中使用,因此每个“索引”都返回10
。 只需保存此变量的副本即可。 例如 :
someFunction = function() {
alert(i); // will alert 10 because using i from the loop!
};
a = "abcdefghijklmnopqrstuvwxyz";
m = {};
for(i=0;i<10;i++){
m[a.charAt(i)] = (function(i, callback) {
// i is a local copy!
return function() {
callback(); // invoke callback function
return i;
};
})(i, someFunction);
}
console.log(m.c()); // would return 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.