this指向的对象是运行时所在的对象,而不是表面代码中所处的对象
以下三种情况,this指向全局对象
情况一 (obj.foo = obj.foo)() // window
情况二 (false || obj.foo)() // window
情况三 (1 , obj.foo)() // window
1 var a = { 2 p: 'Hello', 3 b: { 4 m: function() { 5 console.log(this.p); 6 } 7 } 8 }; 9 10 a.b.m() // undefined
对象中的方法,本质上是函数。函数被单独创建在内存当中,对象属性(方法名)的属性描述对象的value属性保存了函数的地址。实际执行如下代码:
1 var b = { 2 m: function() { 3 console.log(this.p); 4 } 5 }; 6 7 var a = { 8 p: 'Hello', 9 b: b 10 }; 11 12 (a.b).m() // undefined,等同于 b.m()
此时this指向b,b中没有变量p。
一: 把方法赋值给变量,通过变量调用函数相当于在全局环境下调用函数,this指向全局环境
二:把对象赋值给变量,在对象环境下调用函数,this指向对象