下午看了js引擎的執行過程,其中有個環節是預解析,這裡面潛藏著許多在js開發過程中遇到的麻煩的根源。
先奉上熟悉的**:
alert(i)
var i=0;
執行結果,彈出undefined。為什麼是這樣呢,這裡就來尋找根源,就是本文的中心思想,js預解析。
在js引擎解析的時候,看到var i=0這行就先把i預先宣告了(意思就是再**執行前的動作),但不會給它賦值就形如下面:
var i;
alert(i)
i=0;
這樣看來就很理所應當了。這裡還要提出的:
alert(a)
var a = function(){}
和剛才的那個一樣的結果,只不過這個function可以作為變數使用。
除了var還有function也會預宣告,這裡有點特殊,是函式就不僅僅是宣告了,而且還把匿名函式給了這個變數:
alert(a)
function() a{}
這裡就不是undefined了而是function了。甚至可以直接執行:
a()function a()
因為在執行a()之前,預解析已經把乙個function賦值給a了
這裡就有個問題,當var a=1和function a(){}同時被預解析的時候,會最終執行function a(){}:
alert(typeof a)
var a = "x";
function a(){}
和alert(typeof a)
function a(){}
var a = "x";
彈出的結果都是function
js的預編譯
預編譯發生在函式執行前一刻 預編譯執行的步驟 1建立執行期上下文,activation object 即ao 2找形參和變數宣告,將形參和變數宣告做為ao的屬性名,尚未賦值,值為 undefined 3將形參和實參相統一,即把實參的值傳到形參裡面去 4在函式體裡面找函式宣告,賦值函式體 functi...
js的預編譯
函式執行前函式究竟做了什麼?一。函式執行前,首先會通篇檢查有沒有語法或者 寫錯的,如果有就直接報錯,如果沒有就會進行下一步 二。函式的預編譯階段 1.首先會在函式內生成乙個ao物件,2.變數或者形參作為函式的屬性名或者鍵名屬性值是undefined 3.實參給形參 4.函式宣告作為屬性值,屬性名為f...
js的預編譯
1.語法分析 通篇掃瞄看有沒有語法錯誤 2.預編譯 3.解釋執行 預編譯有兩種情況 一種是全域性的預編譯 一種是函式的預編譯 函式的預編譯 預編譯 函式執行的前一刻 下面 再預編譯的過程中發生了什麼變化呢 function demo num var num 13 console.log num 13...