我有一个遵循这种模式的代码:
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
关于javascript匿名函数作用域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911593/