代码示例:
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs.push(function() {
console.log(i);
});
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
在上面的代码中,我们创建了一个包含三个函数的数组funcs
。每个函数都打印变量i
的值。 这样做的结果是,当我们调用funcs
数组中的函数时,它们都打印了i
的当前值,这是3,因为循环已经完成。
如果我们想使闭包影响输出结果,我们可以将var i
替换为let i
。这将使i
成为块级作用域,每次迭代都会创建一个新的变量i
。因此,每个函数将引用不同的变量i
,而不是所有函数引用相同的变量i
。代码示例如下:
var funcs = [];
for (let i = 0; i < 3; i++) {
funcs.push(function() {
console.log(i);
});
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
此时,当我们调用funcs
数组中的函数时,它们将分别打印变量i
的值,即0、1、2。这是因为每个函数都引用一个不同的变量i
,并且它们会捕获其所在的块的上下文。这就是闭包的工作原理。
上一篇:闭包是否线程安全?
下一篇:闭包是否总是需要在IIFE中?