JS預處理階段、執行階段的理解
阿新 • • 發佈:2017-11-24
掃描 指針 執行 js預處理 有用 方式 ole 保存 style
預處理階段涉及到變量和(以函數聲明方式聲明的)函數的聲明的提前的原理,並且涉及到聲明變量沖突時候的一些問題。需要與執行階段進行一定的區分,進而加深理解。
1. 預處理階段將變量保存在window域中,會掃描用var操作符聲明的變量以及用函數聲明的方式聲明的函數指針。因此會產生變量提前和函數聲明提前的效果。
需要說明的是:
- 如果變量並沒有用var聲明,如b = 1;那麽即使在函數執行階段將其默認為全局變量,在預處理階段也不會將其添加到window域中。直到執行到這一條語句的時候,才會將其和對應的值添加。
- 函數表達式用var聲明,所以處理方式與用var聲明的其他變量一樣。
- 這段代碼:
vara = 1; b = 2; function f (){console.log("11");} var g = function(){console.log("22");};
在預處理階段window域的情況:
window{
f : 指向函數,
a : undefined,
g : undefined
}
在執行階段window域的情況:
window{ f : 指向函數, a : 1, b : 2, g : 指向函數 }
2. 如果聲明發生沖突。那麽在預處理的時候遵循兩個規則:a. 先掃描函數,再掃描var聲明的變量;b. 如果與之前的聲明發生沖突的是函數,則覆蓋;如果是var聲明的變量,則忽略,如下面這段代碼:
alert(f); function f(){ console.log("11"); } var f = 1;
alert的將是"f(){console.log("11");}
JS預處理階段、執行階段的理解