读书文1-你不知道JavaScript

185 阅读3分钟

第一章 作用域

​ 就是能够存储变量当中的值,并且能在之后对这个值进行访问或修改。

1.编译原理

分词 —————> 解析 —————> 代码生成

a. 分词/词法分析(Tokenizing/Lexing) 将由字符串组成的字符串分解成有意义的代码块,这些代码被称为词法单元(token)。 空格是否会被当做此法单元,取决于空额在这门语言中是否具有意义。 分词词法分析之间的主要差异在于词法单元的识别是通过有状态和无状态的方式进行的。简单来说,如果词法单元生成器在判断a是一个独立的词法单元还是其他此法单元的一部分时,调用的是有状态的解析规则,那么这个过程就被称为词法分析。

b. 解析/语法分析(Parsing) 将词法单元流(数组)转换成一个元素逐级嵌套所有组成的树,这个过程被称之为”抽象语法树“(Abstract Syntax Tree, AST)。

c. 代码生成 将AST转换为可执行代码的过程被称为代码生成。这个过程与语言、目标平台等息息相关。

引擎、编译器、作用域

变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后再运行时引擎会在作用域中查找该变量,去过能够找到就会对它赋值。

LHS RHS

LHS查询 视图找到变量的容器本身
RHS查询 简单的查找某个变量的值

当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用域中无法找到某个变量是,引擎就会在外层浅谈的作用域中继续查找,知道找到该变量。或滴答最外层的作用域(也就是全局作用域)为止。

~作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询。~


第二章 词法作用域

作用域共有两种主要的工作模型,第一种是最为普遍的,被大多数变成语言所采用的词法作用域,另外一种叫作动态作用域。

JavaScript采用的是词法作用域。

1.词法阶段

抛开遮蔽效应,作用域查找始终从运行时所处的最内部作用域开始,主机向外或者说向上进行,知道预见第一个匹配的标识符为止。

全局变量会自动成为全局对象的属性,因此可以不直接通过全局对象的此法名称,而是间接的通过对全局对象属性的引用来对其进行访问。通过这种技术可以访问那些被同名变量所遮蔽的全局变量。但非全局变量如果被遮蔽了,无论如何都无法被访问到。

2. 欺骗词法

如何在运行期间修改词法作用域

eval() setTimeout() setInterval() new Function()

with 避免使用

以上两个会在运行时修改或创建新的作用域,以此来欺骗其他在书写时定义的词法作用域。