我正在使用VirtualJoystick的源代码,我对方法绑定感到困惑:
__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之前绑定别名?
答案 0 :(得分:2)
因为否则会调用this
等于全局对象(或严格模式下为null
)。
如果你这样做会发生同样的情况
var temp = this._onTouchStart;
temp();
一般情况下,只要你“混淆”一个方法,即不直接将它作为一个方法调用(点后面有适当的对象),就会失去this
上下文。将方法作为参数传递正是这种别名,这就是addEventListener
所必需的原因。
__bind
或其标准版本Function.prototype.bind解决了这个问题,确保使用所需的this
指针调用该函数。它创建了一个始终使用绑定this
调用的函数版本,而不是上下文确定的版本。