В чем преимущество связывания псевдонима с локальным методом? - PullRequest
0 голосов
/ 14 февраля 2012

Я работаю с исходным кодом для 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 Ответ

2 голосов
/ 14 февраля 2012

Потому что в противном случае он будет вызван с this, равным глобальному объекту (или null в строгом режиме).

То же самое произошло бы, если бы вы сделали

var temp = this._onTouchStart;
temp();

Как правило, всякий раз, когда вы «алиасуете» метод, то есть не вызываете его напрямую как метод (с соответствующим объектом за точкой), вы теряете для него контекст this.Передача метода в качестве параметра делает именно этот тип псевдонимов, поэтому он необходим для addEventListener.

__bind или его стандартной версии Function.prototype.bind , получаетвокруг этого, убедившись, что функция вызывается с указателем this, которого она ожидает.Он создает версию функции, которая всегда вызывается с привязкой this вместо контекстно-определенной версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...