首頁 >web前端 >js教程 >淺談javascript中執行環境(作用域)與作用域鏈

淺談javascript中執行環境(作用域)與作用域鏈

黄舟
黄舟原創
2016-12-13 16:49:571500瀏覽

相信很多初學者對與javascript中的執行環境與作用域鏈不能很好的理解,這裡,我會按照自己的理解同大家一起分享。

一般情況下,我們把執行環境分為全域執行環境和局部執行環境,其中局部執行環境我們又可以稱之為函數執行環境。那麼究竟什麼使執行環境呢?通俗的說,執行環境即為程式碼執行時所處的環境。我們下來看一看如下程式碼,再進一步分析之。

<script><br>var name="zhuzhenwei";
function changeName(){
    if (name=="zhuzhenwei"){
          name="heting";
    }else{
          name="zhuzhenwei";
    }
}
changeName();
console.log(name); //heting<br></script>

   

如上述程式碼,當執行第一個語句時,該語句所在的環境為全局執行環境,應當注意的是:每個執行環境都有一個與之相關聯的變數對象,對於全域執行環境,與它向關聯的物件為window物件。緊接著,下面這條語句宣告了一個函數(注意:這裡只是宣告了函數,沒有被呼叫之前是不會執行內部程式碼的)。  同樣這個函數也是處於全域執行環境的。最後,我們呼叫了changeName()函數,一旦呼叫了函數,那麼立即跳到了changeName()函數的執行環境(即函數執行環境),一旦進入執行環境,便開始建立函數內部對應的變數(如函數中假設出現var a=12;這樣的程式碼),不呼叫函數是不會建立的,且與之相關的變數物件我們認為是活動物件(活動物件開始只包含一個變量,即arguments物件),自此開始從上到下執行語句。同時,程式碼在函數環境中執行時,就會建立變數物件的一個作用域鏈,這個作用域鏈包含changeName()的變數物件和全域變數物件。

作用域鏈實際上就是我們可以透過它從前端到末端可以訪問的範圍,即保證對執行環境有權訪問的所有變數和函數的有序訪問,其中前端是指當前執行程式碼所在的變數對象,這裡現在就是changeName()函數的變數對象,末端是全域變數對象,比如說:我們在執行函數時,需要尋找一個標識符,這是透過作用域鏈的末端進行尋找,若作用域鏈的末端找不到,就一直往上找,直到window物件。雖然在全域環境中我沒有提到作用域鏈,但實際上全域環境中作用域鏈也是存在的,只是只有一個全域變數物件。 很明顯:存取局部變數比存取全域變數更快,因為不用向上搜尋作用域鏈。顯然,作用域鍊是隨著程式碼所處的執行環境的不同而動態變化的。

當執行完changeName()函數之後,即函數執行環境中的程式碼執行完成之後,該環境中的局部變數和局部物件會被立即銷毀(如果變數沒有用var聲明,表示是全域變量,不會在局部環境的程式碼執行之後銷毀),隨即執行環境由函數執行環境轉向全域執行環境,繼續執行console.log(name);語句。只是,如果我們關閉網頁或瀏覽器,全域環境也會被銷毀。

總結如下:

執行環境也成為作用域,執行環境決定了變數的生命週期。

執行環境有全域執行環境和局部執行環境之分,每進入一個執行環境就會創建一個用於搜尋變數和函數的作用域鏈,於是我們認為這個作用域鍊是動態變化的。

函數的局部環境不僅有權存取函數作用域中的變量,而且有權存取其包含環境(父環境),甚至全域環境;而全域環境只能存取在全域環境中定義的變數和函數(局部環境中未使用var聲明的變數也屬於全域變數),不能存取局部環境中的數據(沒有說所有數據,正是因為全域變數可以存取)。注意:函數中的參數時函數的局部變數。

以上就是javascript中執行環境(作用域)與作用域鏈的全部內容,希望本文的內容對大家的學習或工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時想要知道更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn