JavaScript作用域基礎原理
阿新 • • 發佈:2018-10-31
變數作用域
一個變數的作用域指的是 原始碼中作用的區域。超出這個作用區域變數則失效。通過這種作用範圍的差異,區分了2中作用域命名;全域性變數,區域性變數。
全域性變數:屬於javascript頂層作用域window的成員變數。
區域性變數:屬於函式內部的變數,只能在該函式內部被呼叫(私有)
var scope = 'g'; //全域性變數
function checkscope(){
var scope = 'l' //區域性變數
return scope;
}
checkscope(); // ==> 'l'
函式作用域與宣告提前
在C語言中。每一個{}內每一段程式碼都有個字的作用域,而且變數再生命他們程式碼段之外是不可見的 。我們稱為塊級作用域(block scope). js沒有塊級作用域,取而代之的是函式作用域;
函式作用域與宣告提前,js宣告提前
function f(){
console.log(a)
var a = '234'
console.log(a)
}
f()
//undefined
//234
上面的函式執行之後 相當於下面:
function f(){ var a; console.log(a) var a = '234' console.log(a) }
作用鏈
概念:
- 每一個程式碼片斷都有一個與之關聯的作用鏈。
- 作用鏈是一個物件列表或連結串列,定義了作用域中的變數。連結串列中 會以物件形似儲存 父函式。
- 當變數x 引用的時候 會在 作用鏈裡面查詢(這個過程稱作‘變數解析’variable resolution)。
- 它會從第一個(自身)物件開始查詢,如果第一個不存在變數x,javascript會繼續查詢第二個物件,如此類推。 如果作用鏈中不存在變數x,最終會丟擲一個引用錯誤(ReferenceError)的異常。
函式與作用鏈
- 最頂層作用域:
在最頂層程式碼中(也就是 沒有任何程式碼),作用鏈由一個全域性物件組成。 - 不巢狀函式中:
作用鏈由2個物件組成 , 全域性作用域+函式作用域 - 巢狀函式中:
至少有三個物件。
在函式呼叫時
當定義一個函式的時候,實際上它儲存了一個作用域鏈。當呼叫函式時它建立了一個新的物件儲存他的區域性變數,並將這個物件新增至儲存的那個作用域鏈上。
詳細作用鏈文章 傳送門
參考:《JavaScript權威指南》 作者:Flanagan