JavaScript預編譯的基本概念和過程詳解
全局預編譯
- 創(chuàng)建全局對象(Global Object, GO):
- 在瀏覽器中,全局對象是
window對象。
- 在瀏覽器中,全局對象是
- 處理變量聲明:
- 找到所有的變量聲明,將變量名作為全局對象的屬性名,初始值為
undefined。
- 找到所有的變量聲明,將變量名作為全局對象的屬性名,初始值為
- 處理函數(shù)聲明:
- 找到所有的函數(shù)聲明,將函數(shù)名作為全局對象的屬性名,值為函數(shù)對象(整個函數(shù)體)。
示例:
console.log(a); // undefined
var a = 10;
console.log(foo); // Function: foo
function foo() {
return "hello";
}
全局預編譯后的全局對象:
1.創(chuàng)建GO對象
GO{
// 空對象
}
2.處理變量聲明
GO = {
a: undefined
}
3.處理函數(shù)聲明
GO = {
a: undefined,
fn: function() {}
}
函數(shù)預編譯
- 創(chuàng)建活動對象(Activation Object, AO):
- 每次調(diào)用函數(shù)時,都會創(chuàng)建一個新的活動對象。
- 處理形參和變量聲明:
- 將形參和變量名作為活動對象的屬性名,初始值為
undefined。
- 將形參和變量名作為活動對象的屬性名,初始值為
- 形參和實參統(tǒng)一:
- 將實參值賦值給對應(yīng)的形參。
- 處理函數(shù)聲明:
- 找到所有的函數(shù)聲明,將函數(shù)名作為活動對象的屬性名,值為函數(shù)對象。
示例:
function bar(x, y) {
console.log(x); // Function: x
var x = 20;
console.log(x); // 20
function x() {}
console.log(x); // 20
var y = function() {};
console.log(y); // Function: y
}
bar(2);
函數(shù)預編譯后的活動對象:
1.創(chuàng)建AO對象
AO{
//空對象
}
2.處理形參和變量聲明,值為undefined
AO = {
x: undefined,
y: undefined,
}
3.實參和形參統(tǒng)一
AO = {
x: 2,
y: undefined
}
4.處理函數(shù)聲明
AO = {
x: 2,
y: function() {},
x: function() {}
}
總結(jié)
通過預編譯,JavaScript確保在代碼執(zhí)行時,所有變量和函數(shù)都已經(jīng)聲明完畢,避免引用錯誤。這一機制是理解JavaScript作用域和提升(hoisting)的基礎(chǔ)。
到此這篇關(guān)于JavaScript預編譯的基本概念和過程詳解的文章就介紹到這了,更多相關(guān)JavaScript預編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript之典型高階函數(shù)應(yīng)用介紹二
在前一篇文章javascript之典型高階函數(shù)中主要實現(xiàn)了幾個典型的functional函數(shù),文章最后也提出了疑問,為啥那樣的實現(xiàn)與F#之類的函數(shù)式語言“不太一樣”呢?今天來試試更“函數(shù)式”的實現(xiàn)2013-01-01
layui-table對返回的數(shù)據(jù)進行轉(zhuǎn)變顯示的實例
今天小編就為大家分享一篇layui-table對返回的數(shù)據(jù)進行轉(zhuǎn)變顯示的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
javascript垃圾收集機制與內(nèi)存泄漏詳細解析
本文是對javascript中的垃圾收集機制與內(nèi)存泄漏進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11

