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;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() {
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);
}