一、一般函数调用
以下代码,属于全局性调用,this代表全局对象。
var a = 1;
function foo() {
console.log(this.a);
}
foo(); // 1
二、作为对象方法调用
以下代码,this指向上层对象即obj。
function foo() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.foo = foo;
obj.foo(); // 1
三、作为构造函数调用
所谓构造函数,是指通过这个函数,可以生成一个新对象。
var x = 5;
function foo() {
this.x = 1;
}
var obj = new foo();
console.log(obj.x); // 1
console.log(x); // 5
obj.x = 1 表明foo函数内的this不是全局对象,this指向新对象obj,全局变量x的值不变。
四、apply、call、bind调用
具体区别:https://blog.csdn.net/qq_24917475/article/details/90702539
apply()是函数的一个方法,作用是改变函数的调用对象。第一个参数表示改变后的调用这个函数的对象。因此,this指向的是第一个参数。
apply()参数为空时,默认为全局对象。
var x = 0;
function foo() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.foo = foo;
obj.foo(); // 1
obj.foo.apply(); // 0
obj.foo(); // 1