You don't know JS 读书笔记之一 --- 词法作用域

2017/3/22 posted in  JavaScript 前端

什么是词法作用域?
简单来说就是定义在词法阶段的作用域.也就是说词法作用域是你写代码的时候将变量和块作用域写在哪里决定的,所以当词法分析器处理代码时会保持作用域不变.

+------------------------------------①
|                                    |
|  function foo(a){                  |
|     +----------------------------② |
|     | var b = a * 2;             | |
|     |                            | |
|     | function bar(c){           | |
|     |                            | |
|     |  +-----------------------③ | |
|     |  |console.log( a, b, c );| | |
|     |  +-----------------------+ | |
|     | }                          | |
|     | bar(b * 3);                | |
|  }  +----------------------------+ |
|  foo( 2 ); //2,4,12                |
|                                    |
+------------------------------------+
  • ①包含整个全局作用域,其中只有一个标识符:foo;
  • ②包含foo所创建的作用域,其中标识符有:a、bar、b;
  • ③包含bar所创建的作用域,其中标识符有:c;
    作用域由对应的作用域块代码写在哪里决定的,他们是逐级包含的.

没有任何函数可以同时出现在两个外部作用域中,就像一个函数不可以同时出现两个父函数

查找

作用域之间的结构和互相之间的位置关系给引擎提供了足够的位置信息,引擎用这些信息来查找标识符的位置.
作用域查找会在找到第一个匹配的标识符时停止.在多层作用域中可以定义同名的标识符("遮蔽效应",内层标识符"遮蔽"了外层标识符).
词法作用域查找只会查找一级标识符.

#待续#