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 }
1for (var key in
obj)
5 }
1作用域鏈的終點是全域性物件window,首先來說在乙個作用域裡面首先訪問的是作用域鏈的最裡層,如上面的例子的dd函式裡面的e,如果沒有找到就沿著作用域鏈向外層查詢,當然和原型鏈一樣查詢到了立即終止查詢,直到查詢到全域性window的屬性2var c=1;
3 (function
cc() 13}
14})().dd();
15
作用域鏈和原型鏈的聯絡:
如果使用with或者catch語句就會改變作用域鏈。而這些物件都是一些簡單物件,他們也會有原型鏈。這樣的話,作用域鏈會從兩個維度來搜尋。
1、首先在原本的作用域鏈;
2、每乙個鏈結點的作用域的鏈(如果這個鏈結點是有prototype的話);
1 object.prototype.x = 10;with增大的作用域鏈: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 })();
作用域鏈和原型鏈的理解
作用域鏈 函式執行會形成乙個私有的作用域,形參和在當前私有作用域中宣告的變數都是私有變數,當前的私有作用域有自我保護機制,私有變數中遇到乙個非私有的變數,則向它的上級作用域找,如果還不是上級作用域私有的,則繼續向上查詢,一直找到window為止。這種變數一層層向上查詢的機制 作用域鏈機制。原型鏈 例...
作用域鏈與原型鏈
1 什麼是作用域鏈 當 在乙個環境中執行時,會建立變數物件的乙個作用域鏈。由子級作用域返回父級作用域中尋找變數,就叫做作用域鏈。作用域鏈中的下乙個變數物件來自包含環境,也叫外部環境。而再下乙個變數物件則來自下乙個包含環境,一直延續到全域性執行環境。全域性執行環境的變數物件始終都是作用域鏈中的最後乙個...
理解作用域鏈和原型鏈
作用域鏈的概念 要理解es中作用域鏈,首先要從理解執行環境開始。es中 執行都是在乙個具體的執行環境中進行的,每個執行環境有乙個與之關聯的變數物件,該變數中包含著在這個執行環境中可以訪問的變數和函式。這裡所說的執行環境就相當於作用域。最外圍的執行環境是全域性環境,在web瀏覽器中也就是window物...