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

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

clipboard.png

clipboard.png

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

clipboard.png
因此最后的为5,定时器输出为5babel

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

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

第二种 es6 letes5

clipboard.png
原理呢和上面差很少,只是采用es6语法,就是let声明的变量只在它所在的代码块有效。而var命令声明的,在全局范围内都有效,全局只有一个变量i,for循环执行语句也至关于一个块级做用域。so,就是0,1,2,3,4spa

看一下let用babel降级到es5的样子,基本差很少ip

clipboard.png

-----------------------------end------------------------------------------------作用域

相关文章
相关标签/搜索