虽然在平时貌似,很习觉得常的一些用法可是真要弄清这几个概念的时候,确实费了很大功夫,如今虽然不能说明白但总算有了一些心得。好吧下面直接开始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
直接返回全局变量