【问题标题】:how do you execute a function on the returned value of another function?你如何对另一个函数的返回值执行一个函数?
【发布时间】:2014-10-09 16:34:41
【问题描述】:

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

【问题讨论】:

  • 看看这一行:result[i] = function(){ return i; };。您正在将 function 分配给数组中的 ith 位置。这就是为什么你会得到一个 function 数组。你为什么对此感到惊讶?
  • 你有一个函数数组,如果你想让它们执行,你需要执行它们。我认为您的意思是您希望在将它们添加到数组时执行它们,因此您需要添加(),尽管它可能会或可能不会达到您的预期。此外,var result = []; 更规范。

标签: javascript arrays closures


【解决方案1】:

我没有这本书,但我相信我在本书的代码中找到了您正在尝试的示例,该代码可从出版商处下载。

作者试图证明对变量i的引用被捕获,因此执行函数返回10而不是预期的0到9(因为i在循环结束时具有值10) .

这是代码,将原来的document.write 替换为console.log。如cmets中所述,您需要执行功能才能看到作者描述的输出。

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

【讨论】:

  • 很好。我知道我需要调用该函数,我很欣赏你在这里写的东西。但是当我调用 createFunctions() 时,我不是在执行结果函数吗?另外,当我将匿名函数放在括号中时,不是也立即调用该函数吗?
  • 不,在您的编辑中,for 循环中调用的函数再次创建一个函数并将其返回以存储在数组中,因此createFunctions() 正在返回一个函数数组。这里的不同之处在于您正在调用立即调用的函数并将i 的当前值传递给它,这是您在数组中的函数将返回的值(该迭代时i 的值)。
【解决方案2】:

这取决于您何时想要结果,有两种方法可以做到这一点

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多