[英]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.