javascript-詞法做用域規則-做用域鏈-閉包運用學習心得

雖然在平時貌似,很習覺得常的一些用法可是真要弄清這幾個概念的時候,確實費了很大功夫,如今雖然不能說明白但總算有了一些心得。好吧下面直接開始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

 

 直接返回全局變量

相關文章
相關標籤/搜索