1.JS運(yùn)行分為三步
- 語法分析
- 預(yù)編譯
- 解釋執(zhí)行
2.預(yù)編譯時(shí)要做的事
創(chuàng)建對(duì)象,聲明函數(shù)和變量偏窝,但是沒有初始化行為(賦值)
<script>
var a = 1;
function test(a) {
console.log(a);
var b = 123;
function funA() {}
var funB = function() {}
}
var funC = function (){}
test(2);
</script>
對(duì)于以上例子,預(yù)編譯時(shí)執(zhí)行順序如下:
1.創(chuàng)建外層的全局對(duì)象(如window對(duì)象)
obj = {}
2.查找變量與函數(shù)的聲明
obj={
a: undefined,
test: undefined,
funC: undefined
}
解釋執(zhí)行時(shí):變量和函數(shù)體賦值
obj = {
a: 1,
test: function(a) {
console.log(a);
var b = 123;
function funA() {}
var funB = function() {}
},
funC: function (){}
}
執(zhí)行函數(shù)test之前的預(yù)編譯順序:
1.創(chuàng)建AO活動(dòng)對(duì)象(Active Object)
2.函數(shù)與變量聲明
AO = {
a:undefined, //形參
b:undefined,
funA: undefined,
funB: undefined
}
3.實(shí)參賦值給形參
AO = {
a:2, //實(shí)參
b:undefined,
funA: undefined,
funB: undefined
}
解釋執(zhí)行時(shí):賦值
AO = {
a:2,
b:123,
funA: function (){},
funB: function (){}
3.注意事項(xiàng)
- 預(yù)編譯不初始化變量武学,只有在解釋執(zhí)行階段才會(huì)進(jìn)行初始化
- 匿名函數(shù)不參與預(yù)編譯
- 函數(shù)聲明整體提升(無論函數(shù)調(diào)用和聲明的位置是前是后祭往,系統(tǒng)總會(huì)把函數(shù)聲明移到調(diào)用前面)
- var聲明的變量被提升,let和const聲明的變量不會(huì)被提升
- 一切聲明的全局變量火窒,全是window的屬性