this在不同情况的指向问题
------------恢复内容开始------------
全局环境:
无论是否在严格模式下,在全局执行环境中,(任何函数体外部)this都指向全局对象。
// 在浏览器中, window 对象同时也是全局对象: console.log(this === window); // true a = 37; console.log(window.a); // 37 this.b = "MDN"; console.log(window.b) // "MDN" console.log(b) // "MDN"
函数(运行内)环境:
在函数内部,this的值取决于函数被调用的方式。普通函数内部的this分两种情况,严格和非严格模式。
- 非严格模式下,this默认指向全局对象window。
function f1(){ return this; } //在浏览器中: f1() === window; //在浏览器中,全局对象是window //在Node中: f1() === global;
- 在严格模式下,this将会默认为undefined
function f2(){ "use strict"; // 这里是严格模式 return this; } f2() === undefined; // true
作为对象的方法:
当函数作为对象里的方法被调用时,它们的this是调用该函数的对象。
- 函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
- 多层嵌套的对象,内部方法的this只想被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象,而非window)
var o = { prop: 37, f: function() { return this.prop; } }; console.log(o.f()); // logs 37
请注意,这样的行为,根本不受函数定义方式或位置的影响。在前面的例子中,我们在定义对象o
的同时,将函数内联定义为成员 f
。但是,我们也可以先定义函数,然后再将其附属到o.f
。这样做会导致相同的行为:
var o = {prop: 37}; function independent() { return this.prop; } o.f = independent; console.log(o.f()); // logs 37