【js的作用域】

54 阅读2分钟
1. 全局作用域 (Global Scope)
  • 生命周期:从脚本开始执行,直到页面关闭,全局作用域始终存在。
  • 特点:全局作用域中的变量可以在代码的任何地方被访问到。
2. 函数作用域 (Function Scope)

这是在 ES6 出现之前,JavaScript 中**唯一**的局部作用域类型。

  • 是什么:每一个函数都会创建一栋属于自己的“建筑”。

  • 范围:在函数内部声明的变量和函数,只在该函数内部及其嵌套的子函数中可访问。

  • 生命周期:当函数被调用时,函数作用域被创建;当函数**执行完毕**后,该作用域通常会被销毁。

  • 特点

    • 外部无法访问内部:你不能从建筑外面,直接拿到建筑里面的东西。
    • 内部可以访问外部:在建筑里面,你可以看到外面广场上的东西。
3. 块级作用域 (Block Scope) - ES6 的革命

ES6 引入的 let 和 const 关键字,为 JavaScript 带来了块级作用域

  • 是什么:任何由花括号 {} 包裹的代码块(比如 if 语句、for 循环、或者一个独立的 {}),都会创建一个独立的“小房间”。

  • 范围:使用 let 或 const 在一个块中声明的变量,只在该块内部可访问。

  • 生命周期:当代码执行进入该代码块时,作用域被创建;当执行离开该代码块时,作用域被销毁。

  • 特点:提供了更细粒度的作用域控制,让变量的生命周期更可预测,极大地减少了 bug。

  • 作用域链 (Scope Chain)

    • 当 JavaScript 引擎需要查找一个变量时,它会启动一个“查找”过程。

    • 查找路径

      1. 首先,在当前的执行上下文(当前作用域)中查找。
      2. 如果找不到,就通过一个内部链接,去**外部(父级)**作用域中查找。
      3. 再找不到,就继续向更外层的父级作用域查找。
      4. 这个过程会一直持续,直到全局作用域
      5. 如果在全局作用域中仍然找不到,就会抛出 ReferenceError。
    • 这个由内到外、层层嵌套的作用域链接,就构成了作用域链

    es6的新特性

    一、let 和 const 带来的块级作用域

    二、箭头函数

    三、模版字符串

    四、默认参数、剩余参数、展开语法

    五、解构赋值

    六、promise

    七、模块化 imoort export

    八、class类

    九、set map

    十、for of 遍历