JavaScript中的this关键字

202 阅读1分钟

this总是指向调用它所在的方法的对象

在全局环境下,无论是否在严格模式下,this的指向都是全局对象(在浏览器中,window为全局对象)。

// 在浏览器中, window 对象同时也是全局对象:
console.log(this === window); // true

a = 37;
console.log(window.a); // 37

this.b = "JS";
console.log(window.b)  // "JS"
console.log(b)         // "JS"

在函数的内部,this的值取决于函数被调用的方式

非严格模式下,且this不是由该调用设置的,this默认指向的是全局对象

function f1(){
  return this;
}
//在浏览器中:
f1() === window;   //在浏览器中,全局对象是window

//在Node中:
f1() === global;

在严格模式下,this将保持它进入执行环境时的值,如下代码

function f2(){
    "use strict" //严格模式
    return this;
}

f2() === undefined; //true
//因为f2()是由window对象调用的,所以this指向全局对象
window.f2() === window //true

当函数作为对象里的方法被调用时,它们的 this 是调用该函数的对象。

//当o.f()被调用时,函数内的this将绑定到o对象上
var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};

console.log(o.f()); // logs 37

我们也可以先定义函数,然后再将其附属到o.f

var o = {prop: 37};

function independent() {
  return this.prop;
}

o.f = independent;

console.log(o.f()); // logs 37

this 的绑定只受最靠近的成员引用的影响。在下面的这个例子中,我们把一个方法g当作对象o.b的函数调用。在这次执行期间,函数中的this将指向o.b。事实证明,这与他是对象 o 的成员没有多大关系,最靠近的引用才是最重要的。

o.b = {g: independent, prop: 42};
console.log(o.b.g()); // 42