我正在处理VirtualJoycle的源代码,我对方法绑定感到困惑:
__bind = function(fn, me){return function(){return fn.apply(me, arguments); }; };
this._$onTouchStart = __bind(this._onTouchStart , this);
接下来它创建一个eventListener:
this._container.addEventListener( 'touchstart' , this._$onTouchStart , false );
指的是后来定义的一种方法:
VirtualJoystick.prototype._onTouchStart = function(event)
{
if( event.touches.length != 1 ) return;
event.preventDefault();
var x = event.touches[ 0 ].pageX;
var y = event.touches[ 0 ].pageY;
return this._onDown(x, y)
}
这对我来说似乎很复杂。为什么要在创建eventListener之前绑定别名?
因为否则它将被调用,this
等于全局对象(或在严格模式下为null
)。
如果你做也会发生同样的情况
var temp = this._onTouchStart;
temp();
通常,任何时候"别名"一个方法,即不要直接将其作为方法调用(点后面有适当的对象),都会丢失它的this
上下文。将方法作为参数传递正是这种别名,这就是为什么addEventListener
需要这样做的原因。
__bind
或其标准版本Function.prototype.bind绕过了这一点,确保使用所需的this
指针调用函数。它创建了一个始终使用绑定this
调用的函数版本,而不是上下文确定的版本。