Loading... ## 首先抛出问题: ## 红宝书上有这样一个问题 ```javascript 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 26, 2021 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏