什么's将别名绑定到本地方法的优点

What's the advantage of binding an alias to a local method?

本文关键字:地方法 绑定 别名 什么      更新时间:2023-09-26

我正在处理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调用的函数版本,而不是上下文确定的版本。