2012-02-13 30 views
0

我與VirtualJoystick源代碼工作,我感到困惑的方法結合:將別名綁定到本地方法的優點是什麼?

__bind = function(fn, me){return function(){return fn.apply(me, arguments); }; }; 
this._$onTouchStart = __bind(this._onTouchStart , this); 

接着,它創建了一個事件監聽:

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之前綁定別名?

回答

2

因爲否則它將被調用與this相等的全局對象(或在嚴格模式下爲null)。

,如果你沒有

var temp = this._onTouchStart; 
temp(); 

一般而言,任何時候同樣會發生你的「別名」的方法,即不直接調用它的方法(用點後面的合適的對象),你失去了this背景。將方法作爲參數傳遞的確實是這種別名,這就是爲什麼它需要addEventListener

__bind或其標準版本Function.prototype.bind,解決此問題,確保函數調用它所期望的this指針。它創建一個函數版本,該函數始終使用綁定的this而不是上下文確定的版本來調用。

+0

謝謝你清理這個,Domenic! – Jackalope 2012-02-14 00:45:36

+1

閱讀你的答案後,我發現這篇文章似乎更詳細地涵蓋了這個特定問題: http://bitstructures.com/2007/11/javascript-method-callbacks – Jackalope 2012-02-14 14:55:58

相關問題