預處理階段涉及到變量和(以函數聲明方式聲明的)函數的聲明的提早的原理,而且涉及到聲明變量衝突時候的一些問題。須要與執行階段進行必定的區分,進而加深理解。函數
1. 預處理階段將變量保存在window域中,會掃描用var操做符聲明的變量以及用函數聲明的方式聲明的函數指針。所以會產生變量提早和函數聲明提早的效果。spa
須要說明的是:指針
var a = 1; b = 2; function f (){console.log("11");} var g = function(){console.log("22");};
在預處理階段window域的狀況:code
window{
f : 指向函數,
a : undefined,
g : undefined
}
在執行階段window域的狀況:blog
window{ f : 指向函數, a : 1, b : 2, g : 指向函數 }
2. 若是聲明發生衝突。那麼在預處理的時候遵循兩個規則:a. 先掃描函數,再掃描var聲明的變量;b. 若是與以前的聲明發生衝突的是函數,則覆蓋;若是是var聲明的變量,則忽略,以下面這段代碼:io
alert(f); function f(){ console.log("11"); } var f = 1;
alert的將是"f(){console.log("11");}console