關於原型鏈和作用域鏈的終點問題

2022-03-25 05:15:25 字數 1629 閱讀 8228

1

1
原型鏈的終點是object.prototype,當乙個訪問乙個物件的屬性的時候,首先在它的建構函式裡面去查詢this定義的屬性,如果找到相應的屬性就立即終止查詢,如果沒有找到相應的屬性,就沿著原型鏈一層一層的查詢直到object.prototype。例如上面的第乙個例子訪問物件k的屬性b,首先查詢建構函式下面的this定義的屬性,沒找到就到原型屬性上去找,結果找到了屬性b,這是查詢終止而不會到object.prototype;但是對於第二個例子,在建構函式和物件原型中都沒找到,就找到了object.prototype上,這就是原型鏈的終點,如果在object.prototype(原型鏈的終點)上也沒有查詢到屬性的話就會報錯undefined。

注意乙個問題就是原型鏈上面的屬性在用for-in loop的時候也會被迴圈到,所以要過濾掉原型屬性的話可以採用

1

for (var key in

obj)

5 }

或者:

1

for (var key in

obj)

5 }

1

2var c=1;

3 (function

cc() 13}

14})().dd();

15

作用域鏈的終點是全域性物件window,首先來說在乙個作用域裡面首先訪問的是作用域鏈的最裡層,如上面的例子的dd函式裡面的e,如果沒有找到就沿著作用域鏈向外層查詢,當然和原型鏈一樣查詢到了立即終止查詢,直到查詢到全域性window的屬性

作用域鏈和原型鏈的聯絡:

如果使用with或者catch語句就會改變作用域鏈。而這些物件都是一些簡單物件,他們也會有原型鏈。這樣的話,作用域鏈會從兩個維度來搜尋。

1、首先在原本的作用域鏈;

2、每乙個鏈結點的作用域的鏈(如果這個鏈結點是有prototype的話);

1 object.prototype.x = 10;

3var w = 20;

4var y = 30;6//

在spidermonkey全域性物件裡7//

例如,全域性上下文的變數物件是從"object.prototype"繼承到的8//

所以我們可以得到「沒有宣告的全域性變數」9//

因為可以從原型鏈中獲取

10 console.log(x); //

1011 (function

foo() 是從它那裡繼承的

19with ()

23//

在"with"物件從作用域鏈刪除之後

24//

x又可以從foo的上下文中得到了,注意這次值又回到了100哦

25//

"w" 也是區域性變數

26 console.log(x, w); //

100, 40

28//

在瀏覽器裡

29//

我們可以通過如下語句來得到全域性的w值

30 console.log(window.w); //

2031 })();

with增大的作用域鏈:

作用域鏈和原型鏈的理解

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

作用域鏈與原型鏈

1 什麼是作用域鏈 當 在乙個環境中執行時,會建立變數物件的乙個作用域鏈。由子級作用域返回父級作用域中尋找變數,就叫做作用域鏈。作用域鏈中的下乙個變數物件來自包含環境,也叫外部環境。而再下乙個變數物件則來自下乙個包含環境,一直延續到全域性執行環境。全域性執行環境的變數物件始終都是作用域鏈中的最後乙個...

理解作用域鏈和原型鏈

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