JS解析與執行過程

問題

在其餘編程語言中,都規定必須先聲明再使用,例如:編程

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)

命名衝突

  1. 若是一個var變量名與一個函數名相同,那麼函數優先
  2. 若是一個var變量名與另一個var變量名相同,那麼以第一個爲準
  3. 若是函數內參數名與函數名相同,以函數優選
  4. 若是函數內參數名與一個var變量相同名稱,參數是第一個因此參數優先
相關文章
相關標籤/搜索