JavaScript是解釋型語言,也就是說,我們的js代碼會通過一個解釋器來進行解釋執行,這個解釋器我們稱為js引擎,因為我們的瀏覽器也能執行js,所以瀏覽器里面也有js引擎,不同的瀏覽器有不同的js引擎,比如chrome的V8,safari的webkit,IE瀏覽器的Trident等。
js引擎的執行需要走三個步驟,第一是進行語法分析,這個比較簡單,就是看你的代碼格式是不是正確的,比如,如果你少了個大括號,就會被報錯。
第二步是進行預編譯,預編譯會把代碼當中使用的變量,定義的函數解析出來,確定出環境中的變量和函數等信息,也就是這個過程會導致js變量提升的問題,比如:
var a = 1; // 變量聲明
function b(y) { // 函數聲明
var x = 1;
console.log('so easy');
};
var c = function() { // 是變量聲明而不是函數聲明!!
// ...
}
b(100);
當js引擎進行預編譯的時候,首選會生成一個GO(Global Object,這里是window):
GO/window = {
//頁面加載創建GO同時,創建了document、navigator、screen等等屬性
a: undefined,
c: undefined,
b: function(y){
var x = 1;
console.log('so easy');
}
}
第三步就是解釋并執行代碼,直到遇到b(100)
,代碼執行后活動對象變成了:
GO/window = {
//頁面加載創建GO同時,創建了document、navigator、screen等等屬性
a: 1,
c: function() {
// ...
},
b: function(y){
var x = 1;
console.log('so easy');
}
}
當執行b(100)
的時候,js引擎會針對b函數進行預編譯,創建AO(Active Object)對象:
AO = {
//創建AO同時,創建了arguments等等屬性,此處省略
y: 100,
x: undefined
}
然后執行b(100)
。
之后會一直重復進行預編譯=>代碼執行的過程。