作用域是当前的执行上下文,在其中的值和表达式“可见”(可被访问)。作用域也可以堆叠成层次结构(作用域链),子作用域可以访问父作用域,反之不行

全局作用域

脚本模式运行所有代码的默认作用域

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

函数作用域

由函数创建的作用域,也称局部作用域

函数内部的变量如何暴露给外界?

  1. return
  2. 闭包

块级作用域

用一对花括号(一个代码块)创建出来的作用域

ES6 新增,使用 letconstcalss 声明的变量拥有块级作用域,严格模式的 function 也支持块级作用域(变量与函数声明

模块作用域

ESModule 模块模式中运行代码的作用域