理解作用域鏈和原型鏈

2022-09-01 21:00:42 字數 804 閱讀 9544

作用域鏈的概念:

要理解es中作用域鏈,首先要從理解執行環境開始。es中**執行都是在乙個具體的執行環境中進行的,每個執行環境有乙個與之關聯的變數物件,該變數中包含著在這個執行環境中可以訪問的變數和函式。這裡所說的執行環境就相當於作用域。最外圍的執行環境是全域性環境,在web瀏覽器中也就是window物件。某個執行環境中的**執行完畢之後,該環境會被銷毀,包含在其中的所有變數和函式也會被銷毀,而全域性環境會在關閉網頁或瀏覽器時才會被銷毀。

每個函式都有乙個自己的執行環境,在執行時彈入環境棧,執行完畢之後彈出。因此當**在某個環境中執行時會建立乙個變數物件的作用域鏈。這個作用域鏈從當前環境的變數物件開始,指向其包含環境的變數物件,依次向前,直到全域性物件window結束。在**執行進行資料訪問時,會沿著這條作用域鏈依次尋找識別符號。因此全域性環境只能訪問全域性變數和函式,而不可以訪問函式中定義的資料,函式中的資料只可以在該函式的執行環境或者其從屬環境中訪問得到。

原型鏈的概念:

原型是與建構函式相關的乙個概念。在定義建構函式時,會產生乙個prototype屬性指向乙個原型物件,原型物件中的屬性即為該建構函式中定義的所有公共屬性。例項物件則會包含乙個指向其建構函式原型物件的指標,由此來共享公共屬性。

而js中所有物件都指向乙個原始物件object,這裡使用到了繼承的概念,也就是所有自定義物件都是繼承自object物件,可以直接使用object物件的屬性和方法。而繼承就是通過原型鏈來實現的。

假如讓建構函式a的例項物件指向另乙個建構函式b的原型物件,則通過a的例項物件就可以訪問到b中定義的公共屬性和方法,也就是a繼承了b。以此類推,可以通過作用域鏈的依次訪問實現多層繼承,而他們最終都會指向object。

理解作用域鏈

先來看兩個例子 var x 10 bar 10 function foo function bar 解析 執行bar,相當於執行foo foo裡面要輸出x,我們首先要從foo自己的作用域下面去找 foo裡邊是沒有宣告x的,然後我們會到foo的詞法作用域去找,也就是宣告foo的作用域去找。在這裡foo...

如何理解作用域鏈

在js中作用域是什麼?何為作用域 任何程式語言都有作用域的概念,簡單來說,作用域就是變數與函式的可訪問範圍,即作用域控制著變數與函式的可見性和生命週期。js的作用域是靠函式來形成的,也就是說乙個函式的變數在函式外不可以訪問。1全域性作用域也就是go 任何地方都能訪問到的物件擁有全域性作用域。1.1函...

作用域鏈和原型鏈的理解

作用域鏈 函式執行會形成乙個私有的作用域,形參和在當前私有作用域中宣告的變數都是私有變數,當前的私有作用域有自我保護機制,私有變數中遇到乙個非私有的變數,則向它的上級作用域找,如果還不是上級作用域私有的,則繼續向上查詢,一直找到window為止。這種變數一層層向上查詢的機制 作用域鏈機制。原型鏈 例...