全部评论
挺经典的一个题,var是函数级作用域,let是块级。for循环是块级的,var此时是在全局作用域下,相当于运行在一个全局范围的立即执行函数里。所以同步代码执行完了再执行异步代码的时候,i已经变5了。如果采用let那么for循环每次都会新创建一个变量,这样就能满足递增输出。既然知道是作用域问题,我们还可以在for循环里用立即执行函数包裹异步代码,把i作为参数传入,内部异步代码执行时候就会拿到函数作用域中的变量,也就不会出错了
let对于for,if,switch,{},function语句都会有块级作用域,每个作用域里都保存了一个i值;而var声明的变量在function里才有块级作用域,当循环结束时,定时器内部还未执行,此时i为5,所以全是5。
相关推荐
点赞 评论 收藏
分享


查看10道真题和解析