《你不知道的js》之词法作用域

1、作用域的分类

  • 词法作用域
  • 动态作用域(比如Bash脚本、Perl中的一些模式等)。

2、词法作用域

定义:定义在词法阶段的作用域,换句话说,词法作用域是由你写代码是将变量和快作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变(大部分情况是这样)。
这个名称来历是编译器的第一个阶段叫作词法化,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。

3、查找

作用域查找会在找到第一个匹配的标识符时停止。在多层的嵌套作用域中可以定义同名的标识符,这叫做“遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。作用域的查找始终从运行时所处的最内部作用域开始,逐级向外或者向上运行,直到遇见第一个匹配的标识符停止。

4、欺骗词法

  • eval()
  • with()

5、性能

JavaScript引擎会在编译阶段进行数项的性能优化,其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。但如果引擎在代码中发现了eval(...)或with,它只能简单地假设关于标识符位置的判断都是无效的,因为无法在词法分析阶段明确知道eval(...)会接受到什么代码,这些代码会如何对作用域进行修改,也无法知道传递给with用来创建新词法作用域的对象的内容到底是什么。

此处评论已关闭