理解js作用域鏈 原型鏈

2021-08-16 03:37:37 字數 1666 閱讀 4976

關於global object

global object 其實就是 變數物件。當js編譯器開始執行的時候,會初始化乙個global object 來關聯全域性的作用。對於全域性作用域而言,global object j就是variable object.在瀏覽器端 被具象成為window 物件。也就是說global object == 全域性環境的variable object == window

關於活動對像 activation object

在函式被啟用的時候,活動物件會被建立並且會被分配給執行上下文,ao是由特殊的物件arguments初始化而成,隨後被當做變數物件用作函式初始化。

執行環境和作用域鏈 execution context and scope chain

執行環境可以抽象的理解為乙個物件

executioncontext:
此外js直譯器執行階段還會維護乙個環境棧。棧頂始終是正在執行的函式環境。

總結:

在ecmascript 中只有函式可以建立乙個新的作用域。在函式內部定義的變數和內部函式,函式外部是不能直接訪問的。

變數物件是由變數和函式宣告 組成的,如果再加上arguments 和形參,那麼就是活動物件。

作用域鏈與原型鏈的類似。如果乙個變數在函式自身的作用域(活動變數)中搜尋不到,那麼就會搜尋父級作用域中的變數物件。以此類推。

靜態作用域是乙個語言擁有閉包的必須條件。ecmascript 完全支援閉包,技術上是通過[[scope]] 實現的。

閉包是乙個**塊和以靜態方式儲存所有父級作用域的乙個集合體。所以通過這些作用域函式可以很容易的找到自由變數。

閉包中可能有多個函式有相同的父級作用域,那麼同時操作父級作用域的資料時候,會出現問題。

var data =;

for(var k = 0;k<3;k++)

}data[0]()//3

這是因為所有這些函式擁有相同的[[scope]]

函式呼叫的的時候活動物件被建立,就是變數物件+arguments + 引數變數

作用域鏈:

原型鏈:

function

supertype

()supertype.prototype.gesupertpropertyvalue = function

()function

subtype

()subtype.prototype = new supertype();

subtype.prototype.getsubpropertyvalue = function

()var instance = new subtype();

instance.gesupertpropertyvalue ();//true

//會經過(1) 搜尋例項(2) 搜尋subtype.prototype(3) 搜尋supertype.prototype

__proto__ 是指向構造該例項的建構函式的原型

JS 作用域鏈與原型鏈

轉 作用域是針對變數的,比如我們建立了乙個函式,函式裡面又包含了乙個函式,那麼現在就有三個作用域 全域性作用域 函式1作用域 函式2作用域 作用域的特點就是,先在自己的變數範圍中查詢,如果找不到,就會沿著作用域往上找。如 var a 1 function b c b 最後列印出來的是3,因為執行函式...

作用域鏈和原型鏈的理解

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

理解作用域鏈和原型鏈

作用域鏈的概念 要理解es中作用域鏈,首先要從理解執行環境開始。es中 執行都是在乙個具體的執行環境中進行的,每個執行環境有乙個與之關聯的變數物件,該變數中包含著在這個執行環境中可以訪問的變數和函式。這裡所說的執行環境就相當於作用域。最外圍的執行環境是全域性環境,在web瀏覽器中也就是window物...