1. 全局作用域 (Global Scope)
- 生命周期:从脚本开始执行,直到页面关闭,全局作用域始终存在。
- 特点:全局作用域中的变量可以在代码的任何地方被访问到。
2. 函数作用域 (Function Scope)
这是在 ES6 出现之前,JavaScript 中**唯一**的局部作用域类型。
-
是什么:每一个函数都会创建一栋属于自己的“建筑”。
-
范围:在函数内部声明的变量和函数,只在该函数内部及其嵌套的子函数中可访问。
-
生命周期:当函数被调用时,函数作用域被创建;
当函数**执行完毕**后,该作用域通常会被销毁。 -
特点:
- 外部无法访问内部:你不能从建筑外面,直接拿到建筑里面的东西。
- 内部可以访问外部:在建筑里面,你可以看到外面广场上的东西。
3. 块级作用域 (Block Scope) - ES6 的革命
ES6 引入的 let 和 const 关键字,为 JavaScript 带来了块级作用域。
-
是什么:任何由花括号 {} 包裹的代码块(比如 if 语句、for 循环、或者一个独立的 {}),都会创建一个独立的“小房间”。
-
范围:使用 let 或 const 在一个块中声明的变量,只在该块内部可访问。
-
生命周期:当代码执行进入该代码块时,作用域被创建;当执行离开该代码块时,作用域被销毁。
-
特点:提供了更细粒度的作用域控制,让变量的生命周期更可预测,极大地减少了 bug。
-
作用域链 (Scope Chain) :
-
当 JavaScript 引擎需要
查找一个变量时,它会启动一个“查找”过程。 -
查找路径:
- 首先,在当前的执行上下文(当前作用域)中查找。
- 如果找不到,就通过一个内部链接,去**外部(父级)**作用域中查找。
- 再找不到,就继续向更外层的父级作用域查找。
- 这个过程会一直持续,直到全局作用域。
- 如果在全局作用域中仍然找不到,就会抛出 ReferenceError。
-
这个由内到外、层层嵌套的作用域链接,就构成了作用域链。
es6的新特性
一、let 和 const 带来的块级作用域
二、箭头函数
三、模版字符串
四、默认参数、剩余参数、展开语法
五、解构赋值
六、promise
七、模块化 imoort export
八、class类
九、set map
十、for of 遍历
-