fe-interview
fe-interview copied to clipboard
var与let、const的区别?
var支持变量提升,但是变量提升会带来变量被覆盖,变量污染的问题,let和const是为了解决变量提升而引入的,两者都支持块级作用域,作用域块内的变量不影响块外面的变量。
在同一段代码中,ES6是如何做到既支持变量提升的特征,又要支持块级作用域的?
编译并创建执行上下文,var声明的变量全部都放到变量环境,let/const声明的变量放到词法环境,在词法作用域的内部维护了一个小形栈,变量进行查找的时候,也是从词法环境中的某个块中查找,查到就直接返回给 js 引擎。查不到就继续在变量环境中查找。
如果在初始化之前使用let变量,就会形成一个暂时性死区。
作用域是变量和函数可访问的范围,作用域控制着变量和函数的可见性和生命周期
块级作用域是通过词法环境的栈结构来实现的,而变量提升是通过变量环境来实现,通过两者结合,JavaScript 引擎也就同时支持了变量提升和块级作用域了。