在以下来自Professional JavaScript for Web Developers的代码中,作者说我们应该得到一个长度为10的数组,每个位置的值为10。但是,我得到的是一系列函数 - 而不是值。这是为什么?
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result; //
}
console.log(createFunctions());
这是我的控制台读数:
[function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}, function (){return i;}]
编辑:我尝试用以下代码修复它,但我仍然得到相同的控制台读数:
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(num){
return function(){
return num;
};
}(i); //
}
return result;
}
console.log(createFunctions());
答案 0 :(得分:2)
我没有这本书,但我相信我在本书的代码中找到了您正在尝试的示例,该代码可从发布商处下载。
作者试图表明捕获了对变量i
的引用,因此执行函数会按预期返回10而不是0到9(因为i
具有值{{1}当循环结束时。)
以下是代码,原始10
替换为document.write
。如评论中所述,您需要执行这些函数以查看作者描述的输出。
console.log
答案 1 :(得分:1)
这取决于您希望结果的时间有两种方法
1)
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result; //
}
然后,您需要通过调用函数
来获取函数的返回值var vals = createFunctions();
for(var i = 0; i > vals.length; i++)
{
console.log(vals[i]());
}
2)在创建时调用该函数
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++){
result[i] = function(){
return i;
}();
}
return result; //
}
console.log(createFunctions());
如果你注意到我在你的循环中在函数的末尾添加了括号,那么这样做会执行函数并返回值。如果没有括号,您只需将函数分配给数组而不是值