Par*_*and 5 javascript closures scope
运行以下代码:
for (var i=0; i<3; i++) {
setTimeout( function() { console.log(i); } , 500 );
}
Run Code Online (Sandbox Code Playgroud)
输出"3"三次.它输出的是最终值,i而不是i创建内部函数时的值.
如果我想输出为1,2和3,我该如何编写这段代码?如何使用i函数定义时的值而不是最终值?
for (var i=0; i<3; i++) {
setTimeout( function(val) { return function() { console.log(val); } }(i), 500 );
}
Run Code Online (Sandbox Code Playgroud)
所以,在setTimeout时间(当我们定义函数时setTimeout),我们将匿名函数val作为参数调用.这为每个函数调用创建了一个闭包,存储了val我们刚刚调用的函数范围内的值.我使用了一个自动调用函数,它可以立即生成闭包.
在您提供的代码中,代码创建了一个闭包,但是对于整个代码的更大范围,整个代码i本地也是如此,这意味着在运行时,匿名函数将使用i其余部分的变量.代码使用.