《你不知道的JavaScript》(上卷)读书笔记:作用域和闭包1.1

0.作用域是什么?

1.存储和访问变量的值的能力将状态带给了程序。

2.需要一套设计良好的规则来存储变量,并且之后可以方便的找到这些变量,这套规则称为作用域。

最初个人的理解作用域是“势力范围”,看来还是粗浅了一些,对“势力范围”进行抽象即变量存储和访问的规则。

1.编译原理

1.尽管通常将JavaScript归类为“动态”或者“解释执行”的语言,但事实上它是一门编译语言。但是与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统中进行移植。

在传统的编译语言的流程中,程序的源代码执行之前会经历三个步骤,统称为编译。

1.分词/词法分析(Tokenizing/Lexing)

这个过程会将由字符组成的字符串分解成“有意义”的代码块,这些代码块称为词法单元(token)。

例如 var a=2;会被分解成下面的词法单元 var,a,=,2 ;空格是否会被当做词法单元,取决于空格在这门语言中是否有意义。

分词(Tokenizing)和词法分析(Lexing)之间的区别是非常微妙的,晦涩的,主要差异在于词法的识别是通过有状态还是无状态的方式进行的,简单来说如果词法单元生成器在判断a是一个独立的词法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,那么这个过程就被称为词法分析。

根据编译原理相关的知识,词法分析通过状态机来进行的,文中的有状态的方式进行即通过状态机进行,看来是如果借助状态机进行来识别,那么这个过程就是词法分析(此处本人还有一处没有想明白,怎样不借助状态机来词法分析?)。

2.解析/语法分析(Parsing)

这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树,这个树被称为“抽象语法树”(AST)。

var a=2; 的抽象语法树中可能会有一个叫做VariableDeclaration的顶级节点,接下来是一个叫做Identifier(值是a)的子节点

以及一个叫AssignmentExpression的子节点,AssignmentExpression的节点有一个叫做Numbericliteral(值是2)的子节点。

《你不知道的JavaScript》(上卷)读书笔记:作用域和闭包1.1_第1张图片

3.代码生成

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

抛开具体细节,简单来说就是有某种方法将 var a=2;的AST转化为一组机器指令,用来创建一个叫做a的变量(包括分配内存等),并将一个值存储在a中。

比起编译过程只有三个步骤的语言的编译器,JavaScript引擎要复杂得多,例如在语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化等。

对于JavaScript来说,大部分情况下,编译发生在代码执行前的几微秒(甚至更短),作用域的背后,JavaScript引擎用尽了各种办法(比如JIT,可以延迟编译甚至实施重编译)来保证性能最佳。

现在出现了3个重要的概念:编译器,JavaScript引擎和作用域。

 

 

你可能感兴趣的:(javaScript理论)