for循环let和var在定时器中的变量泄露

发布时间:2019-08-10 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了for循环let和var在定时器中的变量泄露脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

前几天面试遇到了一些问题,恰好今天偶然间看到了这个问题,决定记录一下

clipboard.png

clipboard.png

定时器中打印结果为5,考察知识点变量提升,同步和异步
解答:首先定时器为异步操作,需要等待函数体执行完毕才可以继续执行,也就是此时的0,1,2,3,4已经打印出来了,i=4时条件成立,i++,此时i=5,下一轮判断失败,结束循环
因为var 存在变量提升,相当于这样

clipboard.png
所以最后的为5,定时器输出为5

然后我又想了想,如果定时器想要打印出0,1,2,3,4有几种实现方式
第一种:
clipboard.png
上结果

for循环let和var在定时器中的变量泄露

采用立即执行表达式来模拟块级作用域,这样的作用是每次将i的值封存在这个匿名函数中,根据作用域返回的定时器会读取匿名函数传递的参数,而不会去读取相隔那么远的放在全局的值,这样就OK了

第二种 es6 let

for循环let和var在定时器中的变量泄露


原理呢和上面差不多,只是采用es6语法,就是let声明的变量只在它所在的代码块有效。而VAR命令声明的,在全局范围内都有效,全局只有一个变量i,for循环执行语句也相当于一个块级作用域。so,就是0,1,2,3,4

看一下letbabel降级到es5的样子,基本差不多

for循环let和var在定时器中的变量泄露

-----------------------------end------------------------------------------------

脚本宝典总结

以上是脚本宝典为你收集整理的for循环let和var在定时器中的变量泄露全部内容,希望文章能够帮你解决for循环let和var在定时器中的变量泄露所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。