我试图更好地理解 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/