首先抛出问题:

红宝书上有这样一个问题

for(var i=1;i<5;i++){
    setTimeout(()=>{console.log(i);},0);
}

这样子,得到的输出结果是:
5
5
5
5

对此的解释,在红宝书上只知道这里定义的i变量是全局作用域变量,并不能明白为何会输出4个5
而经过我一番查阅,总算明白其过程如何。

首先,js引擎是单线程的,所以for循环的执行会在setTimeout函数里面的内容执行之前完成,也即for循环执行4次,调用了4个setTimeout函数后,此时作为全局作用域变量的i已经为5了,从而在for循环执行完毕后,setTimeout函数中执行的4个console.log输出的都是最后的i值,即5。

而如果定义变量用的是let,由于let的作用域是块域,相当于每个setTimeout函数里面都有一个不同的i变量,所以在setTimeout函数中的每一个i都是不同的值,从而可以产生想要的结果

Last modification:July 26th, 2021 at 10:46 am
如果觉得我的文章对你有用,请随意赞赏