编译
- 分词/词法分析
- 解析/语法分析
- 代码生成
变量的赋值操做会执行两个动做,首先编译器会在当前做用域中声明一个变量(若是以前没有声明过),而后在运行时引擎会在做用域中查找该变量,若是可以找到就会对它赋值。 --- 《你不知道的JavaScript(上卷)》 P7html
LHS
和 RHS
就是上面说的对变量的两种查找操做,查找的过程是由做用域(词法做用域)进行协助,在编译的第二步中执行。Left Hand Side
和 Right Hand Side
即左手边和右手边赋值操做的左侧和右侧
console.log(a);
a = 2;
function foo(a) { console.log(a); // 2 } foo(2);
foo(..)
函数的调用须要对 foo 进行 RHS 引用,意味着是取到 foo 的值,而且 (..)
意味着 foo 须要被执行,所以它最好是一个函数类型的值a = 2
,它发生在 2 被当作实参传入 foo 中时。即实参 2 传给了形参 a,须要一个 LHS 查询console.log(..)
自己也须要一个 RHS 引用,即对 console
对象进行 RHS 查询,而且检查获得的值中是否有一个叫作 log
的方法。function foo(a) { var b = a; return a + b; } var c = foo(2);
<!--more-->git
答案:github
c = ..;
a = 2(隐式变量分配)
b = ..
foo(2..
= a;
a ..
.. b
参考原书中文版P12,英文版见 githubide
赋值操做
会致使 LHS 查询。 = 操做符
或调用函数时传入参数的操做都会致使关联做用域的赋值操做
, 即都会致使 LHS 查询。JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程当中,像var a = 2
这样的声明会被分解成两个独立的步骤:函数
var a
在其做用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。a = 2
会查询(LHS查询)变量 a 并对其进行赋值。ReferenceError
异常。不成功的 LHS 引用会致使自动隐式地建立一个全局变量(非严格模式下),该变量使用 LHS 引用的目标做为标识符,或者抛出 ReferenceError
异常(严格模式下)。