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中的函数引用也有一个秘密引用它创建于中的闭包”澄清了我的问题