做用域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 對象(這個對象在全局環境中是不存在的)。做用域鏈中的下一個變量對象來自包含(外部)環境,而在下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是做用域鏈中的最後一個對象。
標識符解析是沿着做用域鏈一級一級地搜索標識符的過程。搜索過程始終從做用域鏈的前端開始,而後逐級地向後回溯,直至找到標識符爲止(若是找不到標識符,一般會致使錯誤發生)。
簡單來講,就是在局部做用域中會先在自身的變量對象中搜索變量和函數名,若是搜索不到則會再上一級尋找,仍是搜不到就會再往上上一級,直至搜索到爲止,這個過程會延續到全局做用域,全局做用域的變量始終是做用域鏈中的最後一個對象