this的指向分为4种:
作为对象的方法调用:
var obj = {
a: 1,
getA: function(){
console.log(this == obj);
console.log(this.a);
}
}
obj.getA();
当函数作为对象的方法被调用时,this指向的是一个局部对象,即当前的这个对象;
作为普通函数调用:
global.name = 'globalName';
var getName = function(){
return this.name;
};
console.log(getName()); // 输出: globalName
//或者
global.name = 'globalName';
var myObject = {
name: "sven",
getName: function(){
return this.name;
}
}
var getName = myObject.getName;
console.log(getName()); //globalName
当this在普通函数里面被用到时,this指向的是一个全局对象,在浏览器上是window,在nodejs上是global
构造函数调用:
var MyClass = function(){
this.name = "sven";
}
var obj = new MyClass();
console.log(obj.name);
构造函数的外表和普通函数一样,它们主要区别于调用的方式,构造函数需要用new运算符,在这里this指向的是一个局部对象,即这个返回的对象
Function.prototype.call或Function.prototype.apply的调用:
var obj1 = {
name: 'sven',
getName: function(){
return this.name;
}
};
var obj2 = {
name: 'anne',
};
console.log(obj1.getName()); //输出:sven
console.log(obj1.getName.call(obj2)); //输出:anne
与普通函数不一样,call和apply可以动态地修改this的指向
博客内容参考自JavaScript设计模式与开发实践,[p24-p27]