1

这是一个关于 javascript 的学术问题。

下面的代码段接受一个整数数组,并返回一个指向函数的指针数组。指向的函数假设返回数组的平方值。

如果输入是 listOfFunction = sqFnList([1,2,3,4,5])

然后listOfFunction[0]()应该返回 1

并且 listOfFunction[1]()应该返回 4

但事实并非如此。

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
      b[i] = function() { return sq;}
   }
   return b;
}

 x = sqFnList([3,4,5])[0]()

问题是 x = 25。提前感谢您的帮助。

4

2 回答 2

4

您的函数都包含对同一变量的引用,一旦您实际调用函数sq,该变量就会具有值。25您需要为每个函数创建一个单独的闭包,每个函数都有自己sq的值副本,以便sq在您想要的时间捕获值:

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
       b[i] = function (the_sq) {
          return function() { return the_sq;}
       }(sq);
   }
   return b;
}

x = sqFnList([3,4,5])[0]()  // x is 9

这是一个要演示的小提琴

于 2013-05-28T17:06:14.983 回答
2

sq范围为sqFnList,您不断更新值,在所有闭包中更改它。您需要为 sq 强制一个新的范围:

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
      (function(sq) {
        b[i] = function() { return sq;}
      })(sq);
   }
   return b;
}
于 2013-05-28T17:06:01.473 回答