執行環境及做用域鏈

一 , 執行環境及做用域鏈

執行環境 :

是js中最爲重要的一個概念,它定義了變量或函數有權訪問的其餘數據,決定了它們各自的行爲,每一個函數都有本身的執行環境.javascript

變量對象:

每一個執行環境都有與之關聯的變量對象.它保存了這個環境中定義的全部變量和函數前端

執行流 :

當執行流進入一個函數,函數的環境就會被推入一個環境棧中,當執行環境中的全部代碼執行完畢,棧將其環境彈出,把控制權返回給以前的執行環境.保存在該環境中的全部變量和函數定義也隨之銷燬java

做用域鏈 :

當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈.它的用途是保證對執行環境有權訪問的全部變量和函數有序訪問.做用域的前端,始終是當前代碼所在環境的變量對象.
若是這個環境是個函數,則將其活動對象做爲變量對象.活動對象一開始只有一個變量,即arguments對象(是一個相似數組的對象, 對應於傳遞給函數的參數),它只存在於局部環境中
做用域鏈中的下一個變量對象來自包含當前環境的環境(能夠理解爲父函數),而下一個變量對象則來自下一個包含環境.這樣一直延續到全局執行環境;全局執行環境的變量對象始終都是
做用域鏈的最後一個對象變量.標識符解析沿着做用域鏈一層一層往上查找,直到找到爲止.數組

一個例子:函數

var color = "blue";
function changeColor(){
    var anotherColor = "red";
    
    function swapColor(){
        var tempColor = "green";
        //這裏能訪問tempColor,anotherColor和color
    }
    //這裏能訪問anotherColor和color
}
//這裏只能訪問color
changeColor();

注意 : 函數的參數也被看成變量來對待,它就至關於在當前環境中申明的一個變量.ui

二 , 延長做用域鏈

當執行流進入下列任何一個語句,做用域鏈就會被加長.try-catch語句的catch塊with語句url

一個例子:debug

function buildUrl() {
    var qs = "?debug=true";
    with(location){
        var url = href + qs;
}
return url;
}

摘抄自 javascript高級程序設計(第三版) 4.2.1章.目前不是很理解.來日再改.設計

三 , 沒有塊做用域

js不像其餘類C語言,由花括號封閉的代碼塊有本身的做用域.code

if (true) {
        var color = "blue";
    }
alert(color); //"blue"

這裏是在一個if語句中定義了變量color.若是是類C語言中,color會在if執行完後被銷燬,而js則是把這個變量添加到當前的執行環境裏(這裏就是全局環境).
在使用for語句時這一點就很重要.

for (var i=0; i < 10; i++){
        doSomething(i);
}
alert(i);      //10
//i已經跑到了執行環境中了,for循環結束了,i 也依然存在
相關文章
相關標籤/搜索