作用域是当前的执行上下文,在其中的值和表达式“可见”(可被访问)。作用域也可以堆叠成层次结构(作用域链),子作用域可以访问父作用域,反之不行
全局作用域
脚本模式运行所有代码的默认作用域
var a = 'a'
window.b = 'b'
c = 'c' // 不推荐的写法,非严格模式下相当于: globalThis.c = 'c'
function bar() {
d = 'd' // 不推荐的写法,非严格模式下相当于: globalThis.d = 'd'
}
bar()
// --------------------------------------------
delete a // false -> 变量不能删除
delete c // true -> 相当于 delete globalThis.c
// 全局作用域下 var 声明的变量虽然会被挂载到 globalThis
// 但仍不能删除
delete window.a // false
函数作用域
由函数创建的作用域,也称局部作用域
函数内部的变量如何暴露给外界?
- return
- 闭包
块级作用域
用一对花括号(一个代码块)创建出来的作用域
ES6 新增,使用 let
、const
、calss
声明的变量拥有块级作用域,严格模式的 function
也支持块级作用域(变量与函数声明)
模块作用域
ESModule 模块模式中运行代码的作用域