四、作用域

作用域:是JS中的一个规则。规定了变量和函数起作用的区域。
image.png

4.1 作用域划分

作用域分为全局作用域和函数作用域
image.png

4.2 作用域的规则

4.2.1 访问规则

作用域是控制变量的使用范围,对变量的操作有两种: 使用变量和给变量赋值。使用变量就是访问变量。

  1. var a = 133;
  2. function demo() {
  3. console.log(a);
  4. }

作用域内的变量不可以被作用域外访问。但是作用域内可以使用作用域外的变量。

先查看当前作用域中有没有声明过这个变量 如果有就直接用 如果没有 会向上层作用域去找 有就用,没有就继续向上 重复这个过程 直到找到变量或者到了全局发现全局依然没有这个变量 此时会报错

4.2.2 赋值规则

给变量赋值

  1. function demo() {
  2. a = 2333;
  3. }
  4. console.log(a) // 2333

给变量赋值的时候,会遵守以下规则:

先查看当前作用域中有没有声明过这个变量 如果有就直接赋值 如果没有 会向上层作用域查找 如果有就修改这个作用域中的变量 如果没有继续向上 重复这个过程 直到找到变量 或者到了全局依然没有 此时不会报错,而是会悄悄地把它注册为全局变量

4.3 声明提升

声明提升:是指在预解析的过程中,把变量、函数声明提升到作用域的最开头
函数声明是把函数整个提升到作用域的最开头 函数表达式与变量声明仅仅把变量的声明提升上去 没有提升赋值
预解析也会发生在函数作用域中

  1. fun();
  2. function fun() {
  3. console.log(1)
  4. }
  5. fun();
  6. //经过预解析之后
  7. //代码会变成
  8. function fun() {
  9. console.log(1)
  10. }
  11. fun();
  12. fun();