【问题标题】:How to check the index of a function in an Array of functions in JavaScript [duplicate]如何在JavaScript中检查函数数组中函数的索引[重复]
【发布时间】:2017-05-17 05:00:59
【问题描述】:

我对 JavaScript 的水平相当新。 我有一个函数以y 作为输入来返回一个大小为y 的数组,它具有与元素几乎相同的功能。

这是我的代码:

  function createArrayOfFunctions(y) {
    var arr = [];
    for(var i = 0; i<y; i++) {
    arr[i] = function(x) {    
      return x + i);}  //Probably this is the issue
    }
    return arr;
  }

  var input = "5,3,2";

  var [y, n, m] = input.split(",");
  console.log("input = " + input);
  [y, n, m] = [parseInt(y), parseInt(n), parseInt(m)]
  var addArray = createArrayOfFunctions(y);
  console.log(addArray[n](m));  //I would like to add up n and m

当我执行代码时,i 保持在 5 而不是从 0,1,2,3,4 迭代 arr[0],arr[1],arr[2],arr[3], arr[4]。结果,它总是输出m+y 而不是n+m。我曾尝试使用indexOFthis[i] 来找出函数的索引,但它不起作用。我有什么方法可以做到这一点吗?

谢谢!

【问题讨论】:

  • 您能否清楚地说明输入和预期输出是什么?

标签: javascript arrays


【解决方案1】:

您遇到了范围界定问题。

这里有一个解决方案:

function createArrayOfFunctions(y) {
  let arr = [];
  for (let i = 0; i < y; i++) {
    arr[i] = function(x) {
      return x + i;
    };
  }
  return arr;
}

上面使用了let,它将i变量的范围限定为每个循环迭代。

如果由于兼容性而无法使用let,请为每个循环使用 IIFE:

function createArrayOfFunctions(y) {
  var arr = [];
  for (var i = 0; i < y; i++) {
    (function() {
        var _i = i;
        arr[_i] = function(x) {
          return x + _i;
        };
    })();
  }
  return arr;
}

上述代码为 IIFE 中的每个循环缓存每个 i 变量,使其保持在范围内。

【讨论】:

  • 你能解释一下你做了什么改变吗?为什么?这将有助于 OP 和读者
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多