带有回调函数的 Javascript 数组

标签 javascript

我试图更好地理解 JavaScript。这是我从 JavaScript function closures 中读到的一段代码.

var funcs = [];
// create a bunch of functions
for (var i = 0; i < 3; i++) {
   funcs.push(function() {
    console.log(i);
   })
}
// call them
for (var j = 0; j < 3; j++) {
  funcs[j]();
}

数组funcs 有一个推送回调函数。我不明白为什么在 J 循环中,funcs[j]() 会调用这个函数在控制台打印 i
我试图通过添加一些控制台消息来理解这个顺序:

var funcs = [];
console.log("start");
for (var i = 0; i < 3; i++) {
  console.log("i:" + i);
  funcs.push(function(){
    console.log(i);
  })
}

console.log("J loop");
for (var j=0; j<3; j++) {
  console.log("j:" + j);
  funcs[j]();
}

正如预期的那样,所有三个函数都有 3
我的问题是:funcs[j]()是如何调用funcs.push(...)函数的? 我理解 funcs[j] 是引用 funcs 数组的 j 元素。但是为什么有括号 () 会调用 push(...) 函数呢?

最佳答案

function() {console.log(i);} 是一个表达式,其计算结果为记录 i 的函数值。

funcs.push 是一个向数组添加值的函数。

() 放在函数之后将调用该函数。

funcs.push(some_value) 调用 push 函数并将 some_value 作为值传递给数组。

funcs.push(function() {console.log(i);}) 将函数添加到数组。

funcs[0] 的值成为该函数。

() 放在函数之后将调用该函数。

funcs[0]() 调用数组中第一个值的函数。

关于带有回调函数的 Javascript 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135423/

相关文章:

javascript - Jquery:当悬停在菜单项上时,显示文本

javascript - 使用响应式设计时,呈现适合其容器的最大广告位的最佳方式是什么?

javascript - 使用 Nightmare 屏幕截图选择器制作多个屏幕截图

javascript - 隐藏DIV的内容

javascript - 具有不同逻辑的类似 React 组件

javascript - 在表格行内有一个输入复选框,我可以将点击事件添加到行并且仍然能够点击输入吗

javascript - 使用 jQuery 获取表格内的文本框值

javascript - 为什么这个自调用函数中的 console.log 没有被执行?

javascript - 什么正则表达式可以替换所有其他单词?

javascript - jquery。 livequery() 奇怪的行为