作用域
作用域就是变量与函数的可访问范围,即他们可发生作用的区域。在ES6之前,ES的作用域只有全局作用域和函数作用域两种。
- 全局作用域中的对象在代码中任何位置都可以访问
- 函数作用域就是函数内部定义的变量或者函数只能在函数内部被访问,函数执行完后,函数内部定义的变量会被销毁
为了解决变量提升带来的变量污染的问题,ES6引入了let和const关键字,从而实现了块级作用域。
块级作用域
作用域块内声明的变量不影响块外面的变量
那么let关键字是如何影响执行上下文的呢,第一步是编译并创建执行上下文
function foo(){
var a = 1
let b = 2
{
let b = 3
var c = 4
let d = 5
console.log(a)
console.log(b)
}
console.log(b)
console.log(c)
console.log(d)
}
foo()
- 函数内部通过var声明的变量被放到变量环境里
- 通过let声明的变量被放到词法环境里
- 在函数的作用域块内部,let声明的变量并没有存放到词法环境里
当进入函数的作用域块的时候,作用域块中通过let声明的变量会存放在词法环境中的一个单独的区域中。在词法环境内部维护了一个小型栈结构。当作用域执行完成后,该作用域的信息就会从栈顶弹出。
当在作用域块内查找某个变量的时候,将从词法环境的栈顶向下查询,如果找不到则在变量环境中查找