let、var、settimeout的思考

2018-11-22  本文已影响0人  A郑家庆

几天前看过一个例子

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

上一篇 下一篇

猜你喜欢

热点阅读