雖然在平時貌似,很習覺得常的一些用法可是真要弄清這幾個概念的時候,確實費了很大功夫,如今雖然不能說明白但總算有了一些心得。好吧下面直接開始javascript
注本文(*)爲相關連接html
例子1.1java
詞法做用域規則:函數的嵌套關係是定義時決定的,而非調用時決定的,即詞法做用域,即嵌套關係是由詞法分析時肯定的,而運行時決定。
函數
(*)http://blog.csdn.net/zzulp/article/details/8144520this
(*)http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.htmlspa
(*)http://www.jb51.net/article/24101.htm.net
1 var oa=3; 2 3 function a() 4 { 5 var oa = 2; 6 return b(); 7 function b() 8 { 9 return function() 10 { 11 return oa; 12 }; 13 } 14 } 15 alert(a()());//=>2
由於 11行 return oa 在定義時候是在a()函數的做用域內,而且在執行到 這裏的時候 oa 會在 做用域鏈 產生的 活動對象 尋找 若是沒有找到 就會往下 尋找一直找到 全局變量,可是這裏a()函數有從新定義oa 因此code
優先找到了 <2>.htm
1.2對象
1 var oa=3; 2 3 function a() 4 { 5 var oa = 2; 6 return b(); 7 function b() 8 { 9 return function() 10 { 11 return this.oa; 12 }; 13 } 14 } 15 alert(a()());//=>3
這裏的this.oa 被返回出去 (我的看法:this.oa 被認爲是某一個對象下的屬性,在做用域鏈中只有當搜索到 全局對象的時候 oa 是window下的一個屬性 因此成立)
1.3
1 var oa=3; 2 3 function a() 4 { 5 var oa = 2; 6 return b(); 7 function b() 8 { 9 return oa; 10 } 11 } 12 alert(a());//=>2
1.4
1 var oa=3; 2 3 function a() 4 { 5 var oa = 2; 6 return b(); 7 function b() 8 { 9 return this.oa; 10 } 11 } 12 alert(a());//=>3
例子2.1
(*)http://www.w3school.com.cn/js/pro_js_object_scope.asp
(*)http://blog.cnbang.net/tech/2025/
1 var oa=3; 2 var a = { 3 oa : 2, 4 b : function() 5 { 6 return function() 7 { 8 return oa; 9 }; 10 } 11 }; 12 alert(a.b()());//=>3
這裏的oa(我的理解是 :首先這個oa不是a的屬性, 且oa沒有聲明 var 因此直接返回的 就是全局變量,爲了證實這一點 我在這個函數內部 聲明瞭 var oa;嘗試 結構返回 undefined)
2.2
1 var oa=3; 2 var a = { 3 oa : 2, 4 b : function() 5 { 6 return function() 7 { 8 return this.oa; 9 }; 10 } 11 }; 12 alert(a.b()());//=>3
(我的理解是 :由於當 return this.oa 的時候 this指向了 window,我嘗試在 這個方法和這個方法的外層添加 a.oa=10;可是 依然返回3,貌似這裏並無產生做用域的關係,可是
再次作嘗試 將11行改成 return a.oa =>2;說明這裏有做用鏈的關係 只是 當this返回出去的時候 應該是產生了新的做用域鏈 因此this的指向發生了變化 指向了window)
2.3
1 var oa=3; 2 var a = { 3 oa : 2, 4 b : function() 5 { 6 return this.oa; 7 } 8 }; 9 alert(a.b());//=>2
在這個例子裏面 返回了a的b方法 因此this指向了 a
2.4
1 var oa=3; 2 var a = { 3 oa : 2, 4 b : function() 5 { 6 return oa; 7 } 8 }; 9 alert(a.b());//=>3
直接返回全局變量