簡體   English   中英

javascript匿名函數作用域行為

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM