在其餘編程語言中,都規定必須先聲明再使用,例如:編程
var a = 10; // 聲明 alert(a); // 調用
但在JS中,咱們發現,以下:編程語言
alert(a); // 使用變量 fn(); // 調用fn函數 var a = 10; // 聲明 function fn(){}
爲何能夠 先使用後聲明 呢?函數
主要由於是JS解析與執行過程當中的 **預處理**
JS解析與執行過程分紅2部分code
一、全局 (JS一開始解析與執行的地方) 二、函數 (函數調用纔開始解析與執行)
全局JS代碼執行分爲2個階段 (JS一開始就執行如下2個階段)io
1. 預處理階段 2. 執行階段
預處理主要處理如下2種代碼function
一、全局中的函數聲明 二、全局中的用var聲明的變量
###################### 處理前 alert(a); //undefined fn(); alert(b); //報錯,b不是預處理的代碼 var a = 10; b = 123; function fn(){} ###################### 處理後 function fn(){} var a; alert(a); //undefined fn(); alert(b); //報錯,b不是預處理的代碼 a = 10; b = 123;
從上面能夠看出,爲何JS能夠在聲明前調用了,還有一點很重要是:預處理的處理順序:先處理函數,再處理var變量test
函數體內JS代碼執行分爲2個階段 (函數調用時,執行如下2個階段)變量
1. 預處理階段 2. 執行階段
預處理主要處理如下3種代碼命名
一、函數參數 二、函數中的函數聲明 三、函數中的用var聲明的變量
函數體內預處理的處理順序:先處理函數參數,再到函數,最後處理var變量語言
###################### 處理前 function go(a, b){ alert(a) test(); var aa = 10; function test(){} } go(1, true) ###################### 處理後 function go(a, b){ function test(){} var aa; alert(aa) // undefined alert(a) // 1 test(); aa = 10; } go(1, true)