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 37this 的绑定只受最靠近的成员引用的影响。在下面的这个例子中,我们把一个方法g当作对象o.b的函数调用。在这次执行期间,函数中的this将指向o.b。事实证明,这与他是对象 o 的成员没有多大关系,最靠近的引用才是最重要的。
o.b = {g: independent, prop: 42};
console.log(o.b.g()); // 42