◆

JavaScript 词法作用域详解与变量查找机制

2023-02-02 01:370

什么是词法作用域

  • 词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。

词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。动态作用域是在运行时根据程序的流程信息来动态确定的,而不是在写代码时进行静态确定的。

作用域嵌套

如下代码有三个逐级嵌套的作用域

function foo(a) {
  var b = a * 2;

  function bar(c) {
    console.log(a, b, c);
  }

  bar(b * 3);
}

foo(2); // 2, 4, 12

借助图片来看,上述代码共有三个作用域

javaScript的词法作用域
  1. 包含着整个全局作用域,其中只有一个标识符:foo。
  2. 包含着 foo 所创建的作用域,其中有三个标识符:a、bar 和 b。
  3. 包含着 bar 所创建的作用域,其中只有一个标识符:c。

作用域中的变量查找

再如同上述代码,当执行到 console.log( a, b, c ) 时,js 引擎是如何查找这三个变量的呢。

  • 首先会从最内部的作用域,也就是 bar(..) 函数的作用域开始查找
  • 引擎无法在 这里找到 a,因此会去上一级到所嵌套的 foo(..) 的作用域中继续查找
  • 在这里找到了 a, 因此引擎使用了这个引用。
  • 对于其他的变量以此类推.
  • 作用域查找会在找到第一个匹配的标识符时停止。
  • 在多层的嵌套作用域中可以定义同名的 标识符,这叫作“遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。
  • 抛开遮蔽效应,作用域查找始终从运行时所处的最内部作用域开始,逐级向外或者说向上进行,直到遇见第一个匹配的标识符为止。

tip

通过使用 eval、with 可以修改词法作用域的位置,但通常是不建议使用的。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEJavaScript 词法作用域详解与变量查找机制加载中