javascript基礎進階——執行環境及做用域鏈

 概念

執行環境

執行環境定義了變量或函數有權訪問的其餘函數,決定了他們各自的行爲。每一個執行環境都有一個與之關聯的變量對象。javascript

變量對象

環境中定義的全部變量和函數都保存在這個對象中。前端

全局執行環境

全局執行環境是最外圍的一個執行環境。在web瀏覽器中,全局執行環境被認爲是Window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法建立的。java

每一個函數都有本身的執行環境。web

做用域鏈

當代碼在一個環境中執行,會建立變量對象的一個做用域鏈。瀏覽器

用途:保證對執行環境有權訪問的全部變量和函數有序訪問。函數

特色:做用域鏈的前端始終是當前執行的代碼所在的環境的變量對象。若是這個環境是函數,則將其活動對象做爲變量對象。活動對象最開始只包含arguments對象。做用域的下一個變量對象來自包含環境,而再下個來自下一個包含環境。spa

 

var  color ="blue";
function changeColor() {
    
    var anotherColor ="red";
    
    function swapColors() {
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
    }

    swapColors();
}

changeColor();

 

 如圖表示執行環境,內部環境能夠經過做用域鏈訪問外部環境,可是外部環境不能訪問內部環境中的變量和函數。每一個環境均可以向上搜索做用域鏈,以查詢變量和函數;可是不能向下搜索。設計

 

 

 

 沒有塊級做用域

聲明變量

使用var聲明的變量會自動添加到最接近的環境中。若是省略var關鍵字,即會添加到全局環境中。code

function  add(num1,num2) {

    var sum = num1+num2;

    return sum;

}

var result= add(10,10)

console.log(sum)

 

 
 

sum is not defined對象

 
 
function  add(num1,num2) {

    sum = num1+num2;

    return sum;

}

var result= add(10,10)

console.log(sum)

 

 
 
 
 

 

查詢標識符

搜索過程從做用域鏈的前端開始,向上逐級查詢與給定名字匹配的標識符,找到即終止搜索。即若是局部環境中存在着同名標識符,就不會使用位於父環境中的標誌符。

       

var color ="red";

function  getColor() {



    return color;

}



console.log(getColor())

 

 

 

var color ="red";

function  getColor() {

    var color="green";

    return color;

}



console.log(getColor())

 

 

 

 

 

參考:《javascript高級程序設計(第三版)》

相關文章
相關標籤/搜索