Javascript中的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。
this的指向
除去不常用的with和eval的情况,具体到实际应用中,this的指向大致可以分为以下4中。
- 作为对象的方法调用
- 作为普通函数调用
- 构造器调用
- Function.prototype.call或Function.prototype.apply调用
1.作为对象的方法调用
当函数作为对象的方法调用时,this指向该对象:
var obj = {
a: 1,
getA: function(){
alert( this === obj); //输出:true
alert( this.a );//输出:1
}
}
obj.getA();
2.作为普通函数调用
当函数不作为对象的属性被调用时,此时的this总是指向全局对象。在浏览器里,这个全局对象是window。
window.name = 'globalName';
var getName = function(){
return this.name;
}
console.log( getName() );//输出:globalName
3.构造器调用
当用new运算符调用函数时,该函数总会返回一个对象,通常情况下,构造器里的this就指向返回的这个对象。
var MyClass = function(){
this.name = 'sven';
}
var obj = new MyClass();
alert( obj.name );//输出:sven
4.Function.prototype.call或Function.prototype.apply调用
用call和apply可以动态的改变传入函数的this
var obj1 = {
name: 'a',
getName: function(){
return this.name;
}
}
var obj2 = {
name: 'b'
}
console.log( obj1.getName() );//输出:a
console.log( obj1.getName.call(obj2) );//输出:b