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