繁体   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