我试图找出为什么这个脚本没有按i
递增超时,这是我期望它做的:
for( var i=0; i<10; i++ ){
setTimeout( function(){
console.log( i );
}, i*10 );
}
这只记录10
十次。 setTimeout
应该可以访问i
,功能也应该是我所知道的。尽管如此,它并没有像我期望的那样发挥作用。
这是fiddle
答案 0 :(得分:1)
问题在于,当内部函数执行时,i
的值为10,这就是你获得10次,10次的原因。
关闭&#39;关闭&#39;过度变量不超过值。这意味着闭包(setTimeout
中的函数)在关闭时对变量的值执行no时,可以访问变量创建了。
如此有效地执行以下代码:
var i;
for(i=0; i<10; i++ ){
}
// delay 0ms
console.log(i);
// some delay
console.log(i);
// some delay
....
还要记住,JS是一种单线程语言,所以第一个setTimeout
不能执行,直到你&#34; yield&#34;,这意味着{{1}内的第一个函数}只在for循环结束时执行,并不意味着你在setTimeout
答案 1 :(得分:0)
你需要了解关闭。以下是您的问题的解决方案:
for( var i=0; i<10; i++ ){
(function(i){
setTimeout( function(){
console.log( i );
}, i*10 );
})(i);
}