【问题标题】:javascript copy a variable for use in functionjavascript复制一个变量以在函数中使用
【发布时间】:2015-02-17 04:52:50
【问题描述】:

我不太确定如何更好地表达这个问题,但基本上我的问题是这样的:

我有这样的代码(不完全是,这段代码真的很简单,而我的稍微复杂一点):

var funcs = [];
for (var i = 0; i < 10; i++) {
    funcs[i] = function() { return i; };
}

所以想法是funcs 中的每个函数在调用时将返回从 0 到 9 的每个数字。但问题是每个人在调用时仍然引用变量i,所以它们都将返回9。我如何按预期完成这项工作(即对于所有n,funcs[n]() === n)?如何让每个函数范围仅捕获 i 的当前值,而不是更改的值?

【问题讨论】:

  • 如何在该函数中声明一个值为i 的局部变量并返回它呢?
  • 显然这是简化的代码,但如果您的函数仅与 i 的值不同,那么“i”似乎应该只是一个参数。
  • 调用一个函数,为每次迭代创建一个单独的激活帧
  • 欢迎来到Stack Overflow!我相信这应该回答你的问题:JavaScript closure inside loops – simple practical example。如果没有,请告诉我。
  • 是的,谢谢您的回答。我不太确定要搜索什么。

标签: javascript function variables scope


【解决方案1】:

我可以这样做:

var funcs = [];
for (var i = 0; i < 10; i++) {
    (function (i) {
        funcs[i] = function () {
            return i;
        };
    })(i);
}
alert(funcs[3]());

为每次迭代创建一个单独的激活框架

您也可以使用地图:

var numbers = [];
for (var i = 0; i < 10; i++) {
    numbers.push(i);
}

var funcs = numbers.map(function (i) {
    return function () { return i; };
});
alert(funcs[3]());

【讨论】:

    【解决方案2】:
    var funcs = [];
    for (var i = 0; i < 10; i++) {
        funcs[i] = makeFunction(i);
    }
    
    function makeFunction(i) {
        return function() {
            return i;
        }
    }
    

    返回函数中的i 绑定到makeFunction 中的局部变量i,而不是主代码块中的i

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2015-10-18
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多