2014-10-09 77 views
0

以下代码来自专业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

看看这一行:'result [i] = function(){return i; };'。您正将一个*函数*分配给数组中的第i个位置。这就是为什么你得到一个*函数*的数组。你为什么对此感到惊讶? – 2014-10-09 16:39:45

+0

你有一个函数数组,如果你想让它们执行,你需要执行它们。我想你的意思是你想要在将它们添加到数组中时执行它们,所以你需要添加'()',尽管它可能会或可能不会达到你所期望的。此外,'var result = [];'更具规范性。 – 2014-10-09 16:39:58

回答

2

我没有这本书,但我相信我在书的代码中找到了你正在尝试的例子,该代码可以从发布者处下载。

作者试图表明对变量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]()); 
} 
+0

好。我明白我需要调用这个函数,并且我很欣赏你在这里写的东西。但是当我调用createFunctions()时,我不执行结果函数吗?另外,当我在编辑中将匿名函数放在括号中时,是不是立即调用函数? – Goodword 2014-10-09 20:12:43

+0

不,编辑时,for循环中调用的函数会再次创建一个函数并将其返回以存储在数组中,因此'createFunctions()'返回一组函数。这里的不同之处在于你正在调用立即调用的函数并将当前值'i'传递给它,这就是你的数组中的函数将返回的值(在该次迭代中'i'的值)。 – 2014-10-09 20:59:34

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()); 

如果您注意到在通过循环时函数的末尾添加了括号,则执行该函数并返回该值。如果没有括号,只需将函数分配给数组而不是数值

相关问题