var定义的是全局的变量,挂载到window上的。
而let则是定义的局部变量/块变量。
下面以一个循环为例子:
看不出区别?
没事,我们继续看,想想var是全局变量,那么挂载到window上后。执行完是否能访问到该全局变量?答案当然是能。那么let定义的,for执行完后能访问吗?我们来看看一下代码:
这下懂了let和var的区别了吧。
我们再来看一个let和var中比较容易出错的问题:
嗯,这里的setTimeout函数打印的没毛病。
那么我们把setTimeout放入循环中试试:
先看let打印的是123,想想为什么,这里给出解释:需要js环境和作用域的问题。
再看看var:
扩展:如何模拟出var的伪块作用域
思路很简单,通过立即执行函数,把var i 的值再每次循环中传递到立即执行函数中,从而立即执行函数中的setTimeout不管延迟多秒,取得的都不是全局window的i,而是每一次循环叠加传递的i的副本形参。
这里的和go的闭包思想是差不多的。
这样就模拟出了let的效果。
当然形参命名可以不同,换个名字你可能更好理解:
。
再说一下,闭包是指函数可以访问到其他函数作用域的变量。
看下面,子函数可以访问到父级函数的变量,从而构成了js的环境和作用域。这里的环境的概念是非常重要的,这样就延长了函数环境生命周期。
重点:JS函数环境