几天前看过一个例子
for (var i = 0;i < 9; i++) {
setTimeout(()=> {
console.log(i)
}, 1000)
}
for (let i = 0;i < 9; i++) {
setTimeout(()=> {
console.log(i)
}, 1000)
}
for (var i=1; i<=9; i++) {
(function(j){
setTimeout( function timer(){
console.log( j );
}, 1000 );
})( i );
}
首先我们看到的这个是一个for循环,也就意味着里面的代码需要执行9次,创建九个settimeout,第一个例子中settimeout的i值,是一个全局变量i,每次循环这个值都会改变,指向的是最外层也就是全局的i值,当1秒后打印的时候,i的值已经变成了9,所以打印出来的是九个9,第二个例子因为let是有作用域的,所以settimeout的i值指向的是每个循环体中的i值,每次循环的值都是不一样的,打印出来的是0,1,2,3,4,5,6,7,8,第三个例子,因为每个i的值都会传入function中,settimeout中的i作用域在这个闭包中,所以打印出来的值也是0,1,2,3,4,5,6,7,8
网友评论