●在浏览器中,this指向的是全局对象(即window):
var foo = "hello";
console.log(this.foo); // hello
console.log(window.foo); // hello
如果你在声明变量的时候没有使用var或let (ES6)那么这个变量即为全局变量。
foo = "hello";
function test() {
var foo = "world";
}
console.log(this.foo); //hello
test();
console.log(this.foo); //world
●构造函数
先看两个例子:
function foo() {
this.a = 23;
}
var o = new foo();
console.log(o.a); //23
function foo() {
this.a = 23;
return {a: 24};
}
var o = new foo();
console.log(o.a); //24
一开始this
指向全局对象,当我们用构造器定义变量o
之后,此时this
的指向就发生了变化,this
不再指向全局对象,而是指向构造器new出来的那个对象(这里指的是o
)
在第二个例子中,函数foo
是有返回值的,且返回值为对象,所以构造器最后输出的是默认返回的对象,也就是24
而不是23
●函数作为对象的一个属性
如果函数作为对象的属性,而且作为对象的属性调用时,函数中的this指向该对象。
var obj = {
x: 10,
fn: function() {
console.log(this.x)
}
}
obj.fn();
结果显示为
从上面的例子我们可以看到
this
指向了对象obj
,并且在调用他的属性fn()
函数时,成功地返回了x
的值。
我们再看一段类似的代码:
var obj = {
x: 10,
fn: function() {
console.log(this.x)
}
}
var foo = obj.fn;
foo();
结果会是10吗?让数据来告诉我们答案:
答案是undefined
。为什么会是酱紫呢?因为this的指向发生了变化,this不再指向对象obj
,而是指向了全局对象window
,fn()
函数被赋值到新的对象foo
上,而且我们也没有将其作为obj
的属性进行调用,this的指向就会发生了变化。
记住一句话就好:this
指向调用时所绑定函数所绑定的对象!