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



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

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

最新更新