做用域和做用域鏈

  做用域javascript

  在Javascript裏,做用域有兩種:全局做用域和局部做用域前端

1)全局做用域java

全局做用域是最外圍的一個執行環境。根據ECMAScript實現所在的宿主環境不一樣,表示執行環境的對象也不同。在Web瀏覽器中,全局做用域被認爲是window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法建立的。瀏覽器

舉個例子:函數

var a = 123;
console.log(window.a)  //輸出結果爲123

  能夠說 var a = 123 等價於 window.a,能夠經過window.a的方式獲取變量a的值spa

  在全局做用域下,建立的變量是全局變量(global variable),能夠在函數內部讀取對象

 

2)局部做用域blog

每一個函數都有本身的執行環境,在這執行環境就是局部做用域,因此通常也稱爲函數做用域,而在局部做用域中建立的變量稱爲局部變量  注意:要用var聲明ip

function abc(){
    var x = 2;
}

  若是在函數裏省略了var聲明變量,建立的是全局變量,咱們要特別注意作用域

  在函數裏建立的局部變量(local variable),在函數外是沒法讀取的,只能在它的區塊內使用

 

  做用域鏈


var a = 1;
function foo(){
    var b = 2;
    function bar(){
        var c = 3;
        console.log(a+b+c);
    }
    bar();
}
foo()

  這裏函數bar運行a+b+c,可是函數裏裏沒有變量b和c,就會從自身往上依次尋找變量,這個搜索機制就是做用域鏈。這個例子的搜索順序:bar->foo->window

 

在Javascript高程中的定義是這樣的:

當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈(scope chain)。做用域鏈的用途,是保證對執行環境有權訪問的全部變量和函數的有序訪問。做用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。若是這個環境是函數,則將其活動對象(activation object)做爲變量對象。活動對象在最開始時只包含一個變量,即 arguments 對象(這個對象在全局環境中是不存在的)。做用域鏈中的下一個變量對象來自包含(外部)環境,而在下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是做用域鏈中的最後一個對象。

標識符解析是沿着做用域鏈一級一級地搜索標識符的過程。搜索過程始終從做用域鏈的前端開始,而後逐級地向後回溯,直至找到標識符爲止(若是找不到標識符,一般會致使錯誤發生)。

 

簡單來講,就是在局部做用域中會先在自身的變量對象中搜索變量和函數名,若是搜索不到則會再上一級尋找,仍是搜不到就會再往上上一級,直至搜索到爲止,這個過程會延續到全局做用域,全局做用域的變量始終是做用域鏈中的最後一個對象

相關文章
相關標籤/搜索