js的this总是指向一个对象,但是具体指向的是哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的对象。
除去特殊的with和eval的情况,具体可以分为以下四种:
1.作为对象的方法调用
作为对象的方法被调用时,this指向该对象
var obj={ a:1, getA:function(){ alert(this == obj); // true alert(this.a) // 1 } } obj.getA()
2.作为普通函数调用
作为普通函数被调用时,this总是指向全局对象,在浏览器的js中这个全局对象是window
window.name = 'globalName' var getName = function(){ return this.name } console.log(getName()) // globalName
3.构造器调用
js中没有类,但是可以从构造器中创建对象。当使用new对象调用函数时,函数会作为构造器被调用,构造器里的this就会指向这个对象,并且被返回。
var MyClass = function(){ this.name = 'sven'; } var obj = new MyClass(); alert(obj.name) // sven
如果构造器显式的返回一个对象,则不会再返回这个this。
var MyClass = function(){ this.name = 'sven'; return { name: 'anne' } } var obj = new MyClass(); alert(obj.name) // anne
如果构造器返回的不是对象类型的数据,则不会导致上述问题
var MyClass = function(){ this.name = 'sven'; return 'anne' } var obj = new MyClass(); alert(obj.name) // sven
4.Function.prototype.call或Function.prototype.apply
Function.prototype.call或Function.prototype.apply可以动态的改变传入函数的this
var obj = { name: 'sven', getName: function(){ return this.name } } var obj2 = { name:'anne' } obj1.getName() // sven obj1.getName.call(obj2) // anne