这是一个关于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;
}