理解Javascript的call()、apply()和bind()方法的區別
在Javascript中,call()和apply () 方法使開發人員能夠指定函數的上下文(this) 並傳遞參數。雖然這兩種方法的用途相似,但它們在向函數提供參數的方式上有所不同。
何時使用 bind()?
bind() 方法與眾不同透過讓您建立一個保留原始函數上下文的新函數,可以從 call() 和 apply() 中實作。這在處理非同步回調或事件時被證明是有價值的。
考慮以下程式碼片段:
var obj = { x: 81, getX: function() { return this.x; } }; alert(obj.getX.bind(obj)()); alert(obj.getX.call(obj)); alert(obj.getX.apply(obj));
如上面的範例所示,bind() 傳回一個新函數,稍後執行時函數,維護原始函數的上下文(this) 。這有助於在非同步回調和事件中保存上下文。
在事件和非同步回調中的使用
bind() 的常見用例涉及事件偵聽器,如圖所示在下面的程式碼中:
function MyObject(element) { this.elm = element; element.addEventListener('click', this.onClick.bind(this), false); }; MyObject.prototype.onClick = function(e) { var t=this; //do something with [t]... //without bind the context of this function wouldn't be a MyObject //instance as you would normally expect. };
在此範例中,bind() 確保onClick()方法,當由事件觸發時,保留啟動事件偵聽器的 MyObject 實例的上下文。如果沒有bind(),onClick()方法的上下文將不是預期的實例。
bind()的實作
bind(的簡化解釋) ) 方法可以如下實現:
Function.prototype.bind = function(ctx) { var fn = this; return function() { fn.apply(ctx, arguments); }; };
此簡化實作建立一個新函數,該函數使用提供的上下文來呼叫原始函數(ctx) 和參數。原始的 Function.prototype.bind() 實作更加複雜,需要處理額外的場景,例如傳遞額外的參數。
以上是JavaScript 的 `call()`、`apply()` 和 `bind()` 方法有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!