Javascript 如何在块外部访问函数数组中的局部变量
我有下面的代码片段,其中Javascript 如何在块外部访问函数数组中的局部变量,javascript,Javascript,我有下面的代码片段,其中值变成函数数组。每个函数包含一个console.log(i);其中,i是循环的局部变量。但是,当我执行(values[1]())值数组时,console.log会打印i值。我想知道这是怎么可能的 var values = []; for ( let i = 0; i < 2; i++ ) { values.push(function() { console.log(i); }) } console.log(values); /* output
值
变成函数数组。每个函数包含一个console.log(i);其中,i
是循环的局部变量。但是,当我执行(values[1]()
)值数组时,console.log会打印i值。我想知道这是怎么可能的
var values = [];
for ( let i = 0; i < 2; i++ )
{
values.push(function() {
console.log(i);
})
}
console.log(values); /* output : Array [function() {
console.log(i);
}, function() {
console.log(i);
}]*/
values[0](); // output: 0
values[1](); // output: 1
var值=[];
for(设i=0;i<2;i++)
{
value.push(函数(){
控制台日志(i);
})
}
console.log(值);/*输出:数组[函数(){
控制台日志(i);
},函数(){
控制台日志(i);
}]*/
值[0]();//输出:0
值[1]();//产出:1
这称为闭包。有关解释,请参见上面的链接问题。这可能是因为函数关闭了i
变量,并且因为您使用了let
,每个循环迭代都有一个不同的i
变量。(如果您使用了var
,那么只有一个控制台.log
语句会输出值2
)FWIW,我在第2章的新书中详细介绍了这一点,特别是关于让在for
循环中运行请参阅我的个人资料中的链接。我认为这句话“天才在于JavaScript中的函数引用也有一个秘密引用它创建于中的闭包”澄清了我的问题