JavaScript函数指针范围

时间:2013-05-28 17:01:14

标签: javascript scope ecma262

这是关于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。 感谢您的帮助。

2 个答案:

答案 0 :(得分: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

这是a fiddle to demonstrate

答案 1 :(得分: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;
}