0

假设给定一个函数(它是对象的一部分,别担心)

makeClosures : function(arr, fn) {},

其中参数首先是一个数组,例如[1, 2, 3, 4],其次是一个对给定数字求平方的函数(称为 doSomeStuff)

var doSomeStuff = function (x) { return x * x; }

makeClosures应该返回一个与 大小相同的数组arr,其中每个元素都包含对基本上调用doSomeStuff.

所以这是我的实现:

makeClosures : function(arr, fn) {
  var funcs = [];

  for (var i = 0; i < arr.length; i++) {
    var f = function() {
      return fn(arr[i]);
    };

    funcs.push(f);
  }

  return funcs;
},

问题

当我运行我的程序时,返回f值为NaN. 我尝试使用实际数字(return fn[1], return fn(arr[0]))然后它起作用了,这意味着问题出在arr[i](未定义?)。我怀疑内部函数f没有看到循环索引i。为什么?

4

2 回答 2

0

Pointy 的评论:

“在 JavaScript 中,词法作用域发生在函数级别。在循环中构造的所有函数共享同一个变量“i”。在循环结束时,“i”的值是多少?对:arr.length。什么是arr[arr.length] 的值?”

返回的函数在循环迭代后执行,var i 仍在作用域内,array.length 的值超出了数组的范围。

此外,您应该在 for 循环之外声明 f ,范围是在函数级别创建的,而不是在循环内部,因此您在循环的每次迭代中已经存在 f 时声明它。

于 2013-01-05T22:13:07.523 回答
-1

不确定天气会有所帮助,但这是我尝试和工作的。

var arr = [1, 2, 3, 4]
var fn = function (x) { return x * x; }

function makeClosures(arr, fn) {
    var funcs = [];   

    for (var i = 0; i < arr.length; i++) {     

        var f =  fn(arr[i]);       

        funcs.push(f);
    }

    return funcs;
}

myarr = makeClosures(arr, fn);

for (var j = 0; j < myarr.length; j++) {
    alert(arr[j] + ' square is : ' + myarr[j]);
}
于 2013-01-05T22:35:41.070 回答