将别名绑定到本地方法有什么好处?

时间:2012-02-13 23:59:32

标签: javascript javascript-events

我正在使用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之前绑定别名?

1 个答案:

答案 0 :(得分:2)

因为否则会调用this等于全局对象(或严格模式下为null)。

如果你这样做会发生同样的情况

var temp = this._onTouchStart;
temp();

一般情况下,只要你“混淆”一个方法,即不直接将它作为一个方法调用(点后面有适当的对象),就会失去this上下文。将方法作为参数传递正是这种别名,这就是addEventListener所必需的原因。

__bind或其标准版本Function.prototype.bind解决了这个问题,确保使用所需的this指针调用该函数。它创建了一个始终使用绑定this调用的函数版本,而不是上下文确定的版本。