JavaScript闭包作用域:帮助我理解

JavaScript闭包作用域:帮助我理解,javascript,scope,closures,Javascript,Scope,Closures,运行以下代码: for (var i=0; i<3; i++) { setTimeout( function() { console.log(i); } , 500 ); } for(var i=0;ifor(var i=0;i函数f(i){ 返回函数(){console.log(i);}; } 对于(var i=0;i备选方案: for (var i=0; i<3; i++) { (function(val){ setTimeout(function

运行以下代码:

for (var i=0; i<3; i++) { 
   setTimeout( function() { console.log(i); } , 500 ); 
}
for(var i=0;i
for(var i=0;i
函数f(i){
返回函数(){console.log(i);};
}
对于(var i=0;i备选方案:

for (var i=0; i<3; i++) {
   (function(val){
       setTimeout(function() {
           console.log(val);
       },500)
   }(i));
}

for(var i=0;i显式闭包的现代替代方法(当你有一个双重包装的函数时,读起来会有点毛茸茸的)是
function#bind
。一旦你为还没有做ECMAScript第五版的浏览器做了准备,你可以说:

for (var i=0; i<3; i++) {
    setTimeout(function(i) { console.log(i); }.bind(window, i), 500);
}

这个例子使用了两个匿名函数,而@z5h的答案使用了一个命名函数,这可以更清楚地说明这个概念。
for (var i=0; i<3; i++) {
   (function(val){
       setTimeout(function() {
           console.log(val);
       },500)
   }(i));
}
for (var i=0; i<3; i++) {
    setTimeout(function(i) { console.log(i); }.bind(window, i), 500);
}
for (var i=0; i<3; i++) {
    setTimeout(console.log.bind(console, i), 500);
}