【发布时间】:2018-10-15 01:40:33
【问题描述】:
考虑一下这个经典的 JavaScript 闭包函数。我了解关闭是如何展示的。我知道内部函数关闭了变量 i,即 3。
我不明白为什么数组应该包含变量 i,而我们所做的只是将一个函数推入一个数组,其中 i 具有来自 for 循环的值。
function buildFunctions() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push(function() {
console.log(i)
})
}
return arr;
}
var fs = buildFunctions(); // [function(){console.log(1)}, ...and so on]
//not [function(){console.log(i)} ...and so on]
fs[0](); // outputs 3
fs[1](); // 3
fs[2](); // 3
否则,这将返回数组的正确(imo)内容:
function buildFunctions() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push(i)
}
return arr; // [0, 1, 2]
}
【问题讨论】:
-
变量
i被代码创建的所有函数共享>。在循环结束时,i的值是 3,所以这就是你调用函数时得到的值。 -
使用
for (let i=0...,它可以工作,因为它为i创建了一个本地范围。 -
它记录了对
i的引用,而不是它被推送时的值。所有三个引用都是相同的。 -
因为你推送的是一个函数,而不是函数的结果。你所说的只有在代码是这样的情况下才有效:
arr.push(function(){return i;}());然后你将创建一个函数,立即调用它并将 i 的返回值添加到数组而不是函数本身。 Console.log() 不返回任何内容,它只记录到控制台。所以它永远不会将结果返回到数组中。这听起来有点像你在混淆闭包、立即调用的函数和返回值。
标签: javascript arrays variables for-loop closures