【问题标题】:javascript calling function as array elementjavascript调用函数作为数组元素
【发布时间】:2015-11-09 05:59:02
【问题描述】:

我在 Toptal youtube 视频中看到了这个示例,该视频使用的语法无法在 Chrome 中运行,除非我遗漏了什么。这个例子出现在这里 (JavaScript closure inside loops – simple practical example) 并使用相同的语法。为什么这对我没有运行/下面指示的行是否包含有效的语法?

var x, y, funcs = [];

for(x=0; x<5; x++){

    (function(){
        var r = x;
        funcs.push(function(){
        console.log(r);
        });

    });
};  
for (var y=0; y<5; y++){
    funcs[y]();  //<< is this valid JS syntax/why is it not working for me?
};

【问题讨论】:

  • 究竟是什么不工作?
  • 您将 y 声明为 [] 然后再次声明为索引,这可能无法按预期工作。在迭代您的数组并尝试在调试器中检查结果时,还要检索一个返回值。
  • 问题不在于函数调用语法;没关系。问题是您的第一个 for 循环没有在数组中放入任何内容。你有一个从未调用过的匿名函数,所以第一个循环什么都不做。

标签: javascript arrays function loops call


【解决方案1】:

您需要通过在定义后添加一对括号 () 来使这个匿名函数在您的第一个 for 循环中自动执行

(function(){
    var r = x;
    funcs.push(function(){
    console.log(r);
    });

})();

如果没有这个,你会一直在你的第一个循环中声明一个永远不会执行的函数,因此永远不会将任何东西推送到你的数组中。

在您的第一个循环之后,执行console.log(funcs.length),您将获得0,因为您的数组没有元素。

您当前的代码将为您提供uncaught type error: funcs[0] is not a function,这是因为funcs[0]undefined

【讨论】:

  • 可能也应该将x 传递给函数以避免关闭/循环问题。
  • 这不应该是必需的,因为数组中的所有匿名函数都声明了自己的var r
  • 确实如此;我想应该可以正常工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 2020-04-26
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多