2016-03-24 19 views
2

yılında sarma vs bir örnek yöntemi bağlayıcı [Bu Bound function instead of closure to inject extra arguments ile ilgilidir, ama bu ne açıkça sordu ne de cevap verilmiştir.] Ben onun argüman olarak bir işlev bekleyen işlev çağırıyorumisimsiz bir işlev

. Sınıfımın bir örneğine bağlı, sınıfımdaki bir yöntemi geçmek istiyorum.

doSomething(my_instance.myMethod.bind(my_instance)) 

ve anonim işlevinde çağrıyı sarma:

doSomething(function() { my_instance.myMethod(); }) 

var MyClass = function() {} 
MyClass.prototype.myMethod = function() { ... } 

var my_instance = new MyClass(); 

bind kullanma arasında herhangi somut bir fark var mı: gibi berrak, benim sınıf görünüyor varsayalım yapmak için ?

+0

* "my_instance" (ve 'my_instance.myMethod') çözüldüğünde etkin fark * şeklindedir. Bağlamaların hiçbirinin değişmediğini varsayarsak, yöntem çağrıldığında her ikisi de "bu" my_instance "değerine sahip olacaktır. Çağrı çerçeveleri ile küçük farklılıklar olacaktır, ancak * silkmek *. – user2864740

+0

'Bağlama' düşünüldüğünden, burada '' daha iyi '' anlamına geldiğinden emin değilim. – user2864740

+0

@ user2864740 Bu yazının birincil amacını bulanıklaştırdığı için "daha iyi bir şeyler var" sorusunu kaldırdım. –

cevap

1

Sınıfınızdaki bir prototipin bir geri arama üretmesi gerekiyorsa, onun örneğinin adını bilmeyebilir. Sonuç olarak, this'u kullanmanız gerekir, ancak this değeri geri aranmanın yürütüldüğü yere bağlıdır.

aşağıdaki örneğe bakalım: bağlama geri yürüttü zaman değişti (this belirtir ne) için yukarıdaki örnekte

var MyClass = function (x) { this.something = x; }; 
MyClass.prototype.makeCall = function() { 
    var myBadCallback = function() { console.log(this.something); }; 
    var myGoodCallback = function() { console.log(this.something); }.bind(this); 

    // When called, the value of "this" points to... we don't know 
    callMeBack(myBadCallback); 

    // When called, the value of "this" points to this instance 
    callMeBack(myGoodCallback); 
}; 


function callMeBack(callback) { callback(); }; 

var foo = new MyClass('Hello World!'); 
var bar = new MyClass('Goodbye!'); 

// Probably prints "undefined", then prints "Hello World!" 
foo.makeCall(); 

// Probably prints "undefined", then prints "Goodbye!" 
bar.makeCall(); 

, ilk çıkış muhtemelen undefined basar.

Bu örnek, görünebilir gibi görünebilir, ancak bu tür durumlarda ortaya çıkar, genel bir durum AJAX geri çağrılarıdır.

İlgili konular