1. 程式人生 > >JavaScript作用域基礎原理

JavaScript作用域基礎原理

變數作用域

一個變數的作用域指的是 原始碼中作用的區域。超出這個作用區域變數則失效。通過這種作用範圍的差異,區分了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)的異常。

函式與作用鏈

  1. 最頂層作用域:
    在最頂層程式碼中(也就是 沒有任何程式碼),作用鏈由一個全域性物件組成。
  2. 不巢狀函式中:
    作用鏈由2個物件組成 , 全域性作用域+函式作用域
  3. 巢狀函式中:
    至少有三個物件。

這裡寫圖片描述

在函式呼叫時

當定義一個函式的時候,實際上它儲存了一個作用域鏈。當呼叫函式時它建立了一個新的物件儲存他的區域性變數,並將這個物件新增至儲存的那個作用域鏈上。

詳細作用鏈文章 傳送門

參考:《JavaScript權威指南》 作者:Flanagan