javaScript 是由瀏覽器解釋執(zhí)行的腳本語(yǔ)言,不需要先編譯后執(zhí)行,而是通過(guò)瀏覽器 js 解釋器進(jìn)行解釋執(zhí)行
執(zhí)行過(guò)程分為兩步:預(yù)編譯期和執(zhí)行期(以代碼塊為單位,邊解釋邊執(zhí)行)
預(yù)編譯期 js解釋器會(huì)對(duì)本代碼段內(nèi)所有的 聲明的變量和方法進(jìn)行處理,將變量和方法提到對(duì)應(yīng)的作用域的最前面,該過(guò)程只是對(duì)變量進(jìn)行聲明,并不會(huì)進(jìn)行初始化或者賦值(缺省值默認(rèn)為undefined)
JavaScript 中局部變量只可能通過(guò)兩種方式聲明,一個(gè)是作為函數(shù)參數(shù),另一個(gè)是通過(guò) var 關(guān)鍵字聲明。 var 表達(dá)式和 function 聲明都將會(huì)被提升到當(dāng)前作用域的頂部
編譯前
foo(); //alert(1)
function foo(){ //聲明式函數(shù)
alert(1);
}
foo2(); //undefined is not a function
var foo2 = function(){ //賦值式函數(shù)聲明,其實(shí)是函數(shù)表達(dá)式
alert("foo2");
};
編譯后
var foo2; //缺省值是'undefined'
function foo(){
alert(1);
}
foo();
foo2(); //undefined is not a function
foo2 = function(){
alert('foo2');
};