如何对另一个函数的返回值执行函数?

时间:2014-10-09 16:34:42

标签: javascript arrays closures

在以下来自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());

2 个答案:

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

如果你注意到我在你的循环中在函数的末尾添加了括号,那么这样做会执行函数并返回值。如果没有括号,您只需将函数分配给数组而不是值