setTimeout() + for循环

最近有一段前端的面试代码还是有点意思滴:

for (let i = 0; i < 4; i++) {
    setTimeout(function(){
        console.log(i);
        },1000);
}

各位大佬认为结果会是什么?别急,下面这段那:

for (var i = 0; i < 4; i++) {
    setTimeout(function(){
        console.log(i);
        },1000);
}

有的看官就会说,你四不四傻,这两个不是一样的吗?
确实这两段代码99%的地方都是一样的但是不一样的地方是变量i一个是let一个是var,这样子的话结果就会不一样了

首先第一段demo的答案是:0 1 2 3
首先第二段demo的答案是:4 4 4 4

原因:
首先js在执行的时候是单线程的,执行的循序是同步>异步(ajax)>回掉,首先for循环里的setTimeout函数执行4次,将(其里面回掉函数)事件添加的队列等待for循环执行完毕后再执行。
当使用var定义变量时,属于全局变量,当for循环执行完毕后i=4,所以会输出4个4
当let定义变量不时,属于局部变量,因为当每次for循环结束时,回掉函数还没执行,这样每次变量i都不会被释放,所以回调函数在执行时就会找它定义域中的i。

猜你喜欢

转载自blog.csdn.net/hyb_xiaowuwan/article/details/80230920