JavaScript函数指针作用域

JavaScript function pointer scope

本文关键字:作用域 指针 函数 JavaScript      更新时间:2023-09-26

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

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

如果输入为listfunction = 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。提前感谢您的帮助

您的函数都包含对相同变量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

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;
}