作用域是什么
传统编译语言流程中,源代码在执行前经历三个步骤
- 分词/词法分析
- 解析/语法分析
- 代码生成
而javascript引擎要复杂的多,如在语法分析和代码生成阶段有特定的步骤来对运行性能进行优化。
javascript引擎不会有大量时间进行优化,因为js的编译过程不是发生在构建之前。对于js,大部分情况下编译发生在代码执行前几微秒。
var a = 2;这段程序的实际执行过程如下:
- 遇到var a,编译器询问作用域是否已经有一个该名称的变量存在于同一作用域的集合中。如果是,编译器忽略该声明,继续编译,否则它要求作用域在当前作用域的集合中声明一个新的变量,并命名为a。
- 编译器为引擎生成运行代码。引擎首先询问作用域,在当前的作用域集合中是否存在叫做a的变量。如果是,引擎就好使用这个变量,否,继续查找变量(向上查找)。
LHS引用和RHS引用概念