編譯
- 分詞/詞法分析
- 解析/語法分析
- 代碼生成
變量的賦值操做會執行兩個動做,首先編譯器會在當前做用域中聲明一個變量(若是以前沒有聲明過),而後在運行時引擎會在做用域中查找該變量,若是可以找到就會對它賦值。 --- 《你不知道的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
異常(嚴格模式下)。