参数this在面向对象编程的时候非常重要,它的值取决于调用的模式。
在JavaScript中,一共有4中调用模式,方法调用模式,函数调用模式,构造器调用模式(new)和apply调用模式(apply,call,bind),这些构造模式在如何初始化关键参数上存在差异。
方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为该对象的一个方法。当我们调用该方法时,this被绑定到该对象上。
调用方法的方式通常是使用点表达式(.)或者方括号下标表达式([])。如:
函数调用模式
当一个函数并非一个对象的属性时,它就是被当做一个函数来调用的。
在函数调用模式下,this被绑定在全局对象上。在《JavaScript语言精粹》中,被指出这是一种语言设计上的错误。如果正常,在内部函数引用this,应该被绑定在它的外部函数上而不是全局对象。如:
所以,解决这个问题的方法是在外部函数把this保存起来,在内部函数中使用。如:
构造器调用模式
如果在一个函数前加上new关键字,那么将会创建一个直接连接到该函数的prototype成员的新对象,并且将this绑定到新对象上。
apply调用模式(apply,call,bind)
因为JavaScript是一门函数式的面向对象编程语言,所以函数可以拥有方法。
而apply,call,bind都可以用来改变this的指向,所以理所应答可以绑定this对象。这里就不展开了。