在以下来自Web开发人员专业JavaScript的代码中,作者说我们应该得到一个长度为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());
我没有这本书,但我相信我在书的代码中找到了你正在尝试的例子,可以从出版商那里下载。
作者试图表明对变量i
的引用被捕获,因此执行函数会返回10,而不是预期的0到9(因为循环结束时i
的值为10
)。
这是代码,将原来的document.write
替换为console.log
。如注释中所述,您需要执行这些函数才能看到作者描述的输出。
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
var funcs = createFunctions();
//every function outputs 10
for (var i=0; i < funcs.length; i++){
//document.write(funcs[i]() + "<br />");
console.log(funcs[i]());
}
这取决于何时需要结果有两种方法可以实现
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());
如果您在遍历循环时注意到我在函数末尾添加了括号,那么这样做将执行函数并返回值。如果没有括号,您只需将函数分配给数组,而不是值