javascript匿名函数作用域行为

标签 javascript node.js scope

我有一个遵循这种模式的代码:

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/

相关文章:

node.js - 不支持 Nodejs 10.x 运行时的 Sam 构建失败

python - 对python中变量的范围感到困惑

ruby-on-rails - form_for(部分)的路由范围问题

javascript - jquery中的foreach循环

javascript - jquery dom中某处最近的元素(模糊搜索)

javascript - 如何根据 Angularjs 中的某些条件在 Controller 中创建作用域变量

javascript - iOS6 JavaScript touchmove 事件通过垂直滚动之后 jQuery animate 不会触发

node.js - 如何使用 Restify 提供静态文件

node.js - Node selenium-webdriver "Error: Timed out waiting for the WebDriver server at"

Javascript 无法推送到函数内部的全局数组