1. 程式人生 > 其它 >JavaScript程式碼預解析規則

JavaScript程式碼預解析規則

JavaScript程式碼是由瀏覽器中的JavaScript解析器來執行的,JavaScript解析器在執行JavaScript程式碼的時候會進行預解析,也就是提前對程式碼中的var變數宣告和function函式宣告進行解析,然後再去執行其他的程式碼。

為了方便大家更好地理解,下面我們通過一段簡單的程式碼來演示var 關鍵字的預解析效果。

// 以下程式碼中的var num變數宣告會進行預解析
console.log(num);        //輸出結果: undefined
var num = 10;
// 以下程式碼由於不存在 var num2, 所以會報錯
console.log(num2);      //
報錯,提示num2 is not defined(num2未定義)

在上述程式碼中,第2行在變數num宣告前就訪問了變數num,但卻沒有像第5行的num2一樣報錯,這是因為第3行程式碼中的var num會被預解析,相當於如下程式碼。

var num;    // num的變數宣告由於預解析而提升到前面
console.log(num);  //輸出結果: undefined
num = 10;

由此可見,由於num的變數宣告被預解析,所以console.log(num)不會報錯,並且由於賦值操作num = 10不會被預解析,所以此時num的值為undefined。
同樣,JavaScript 中的函式也具有預解析的效果,示例程式碼如下。

fn();
function fn(){
    console.log('fn');
}

在上述程式碼中,fn()函式呼叫的程式碼寫在了函式宣告的前面,但函式仍然可以正確呼叫,這是因為function函式宣告操作也會被預解析。

需要注意的是,函式表示式不會被預解析,示例程式碼如下。

fun(); //報錯,提示fun is not a function( fun不是一個函式)
var fun = function() {
  console.log('fn');
}

上述程式碼提示fun不是一個函式, 這是因為var fun變數宣告會被預解析,預解析後,fun的值為undefined,此時的fun還不是一個函式, 所以無法呼叫。只有第2~ 4行程式碼執行後,才可以通過fun()來呼叫函式。

本文轉自:黑馬程式設計師web前端課程 http://web.itheima.com