2016-03-24 16 views
2

[Diese zu Bound function instead of closure to inject extra arguments verwandt ist, aber das war weder klar gefragt noch beantwortet.]Bindung eine Instanz Methode vs Verpackung in einer anonymen Funktion

ich eine Funktion aufrufen, die eine Funktion als Argument erwartet. Ich möchte eine Methode aus meiner Klasse übergeben, die an eine Instanz meiner Klasse gebunden ist. Um es klar, übernimmt meine Klasse wie folgt aussieht:

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

var my_instance = new MyClass(); 

Gibt es einen substanziellen Unterschied zwischen bind mit:

doSomething(my_instance.myMethod.bind(my_instance)) 

und dem Einwickeln des Anrufs in einer anonymen Funktion:

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

?

+0

Der effektive Unterschied ist *, wenn * 'my_instance' (und' my_instance.myMethod') aufgelöst wird. Angenommen, dass sich keine der Bindungen ändert, haben beide "this" von "my_instance", wenn die Methode aufgerufen wird. Es wird geringfügige Unterschiede zu den Call-Frames geben, aber * shrug *. – user2864740

+0

Ich bin nicht wirklich sicher, was "besser" hier bedeutet, da 'bind' betrachtet wird. – user2864740

+0

@ user2864740 Ich entfernte die Frage "Gibt es etwas besseres", da sie die primäre Absicht dieses Beitrags matschig macht. –

Antwort

1

Wenn ein Prototyp in Ihrer Klasse einen Rückruf generieren muss, kennt er möglicherweise den Namen seiner Instanz nicht. Als Ergebnis müssen Sie this verwenden, aber der Wert this hängt davon ab, wo der Rückruf ausgeführt wurde.

folgendes Beispiel:

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(); 

In dem obigen Beispiel wird die erste Ausgabe druckt wahrscheinlich undefined weil der Kontext (was this bezeichnet) von der Zeit verändert hat der Rückruf ausgeführt hat.

Dieses Beispiel mag künstlich erscheinen, aber diese Art von Situationen entstehen entstehen, ein häufiger Fall ist AJAX Callbacks.

Verwandte Themen