作用域

62 阅读1分钟

定义:变量可访问的范围;

类型分类:2类

  1. 静态作用域:也称词法作用域,JS属于此类;
    • 变量的作用域在代码编写时(而非运行时)就已确定,由代码的物理结构(函数/代码块嵌套关系)决定。
    • 无论函数在哪里被调用,及如何被调用,其词法作用域只由函数申明是的位置决定;
    • 函数内部可以访问外层作用域的变量,但外层无法访问内层作用域的变量。
  2. 动态作用域;

JS中作用域分类:4大类

  1. 全局作用域
  2. 函数作用域: function () => {};
  3. 块级作用域: {},一对花括号创建形成的作用域;
  4. 模块作用域: 每一个ESmodules模块都有自己的作用域;

1. 全局作用域:

在顶层的作用域,内部的变量为全局变量,可在任何作用域内访问到;
全局变量两种形式:
    1.在全局作用域中用let const class 声明的变量;
        未挂载到globalThis全局对象上
    2.全局对象,存储在全局对象中,用varfunction声明后创建的变量;
        可用globalThis(window/global)访问到,进行增删改查

2. 函数作用域:函数内声明的变量,只能在函数内访问;

function a () {
    var b = 1
}
console.log(b) // Uncaught ReferenceError: b is not defined

3. 块级作用域:

// let、const、class 支持块级作用域
{
    var a1 = 0
    let a = 1
    const b = 2
    class C {}
}
console.log(a1) // 0
console.log(a) // Uncaught ReferenceError: b is not defined
console.log(b) // Uncaught ReferenceError: b is not defined
console.log(C) // Uncaught ReferenceError: C is not defined

4. 模块作用域:

每一个ESmodules模块都有自己的作用域,在顶级模块中声明变量不是全局的;