2013-06-16 3 views
6

Ich habe eine Funktion in Javascriptin JavaScript an eine andere Funktion eine Funktion binden

function foo(callback) { 
    console.log("Hello"); 
    callback(); 
} 

und eine andere Funktion

function bar() { 
    console.log("world"); 
} 

und ich möchte eine Funktion machen FooBar

FooBar = foo.bind(this, bar); 

Diese funktioniert gut, aber was ich eigentlich zu tun versuche, ist eine function queue, und oft erstellen en ich, sobald es

[Function: bar] 

TypeError: undefined is not a function 

eine keine Funktion Parameter binden, bevor eine Callback-Bindung, wie im folgenden Beispiel

function foo() { 
    console.log(arguments[0]); 
    var func = arguments[1]; 
    func(); 
} 

function bar() { 
    console.log("world"); 
} 

foo.bind(this, "hello"); 
var FooBar = foo.bind(this, bar); 

FooBar(); 

, die diesen Fehler erzeugt Wie kann eine binde ich eine Funktion an eine andere Funktion müssen wurde an andere Funktionstypen gebunden?

Antwort

5

Sie sind verbindlich "Hello"-foo und separat Bindung bar-foo auch dann - sollten Sie nicht bar auf das Ergebnis des ersten bind binden, wie folgt aus:

var FooHello = foo.bind(this, "hello"); 
var FooBar = FooHello.bind(this, bar); 

Fiddle here. (welche Protokolle "Hallo Welt").

+0

Für ein weniger verschachteltes Beispiel siehe http://jsfiddle.net/XM4kQ/8/. und lies auf bind hier https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind als das Beispiel, zu dem diese Fiddle verlinkt, sieht es so aus, als ob du tatsächlich binding bar bist eine Bindung von foo ... – mschuett

4

Die bind-Methode bindet keine Funktionen aneinander, ihr Zweck besteht darin, den Kontext des Schlüsselworts 'this' und alle Argumente beim Aufruf der Funktion zu korrigieren. Es gibt dann eine neue Funktion zurück, die das Original unverändert lässt.

Also: foo.bind(this, "hello") hat eigentlich keinen Effekt. Wenn Sie die Bindung zum zweiten Mal aufrufen, wird eine neue Funktion mit einem festen Argument von bar erstellt. Der Grund, dass Sie einen Fehler erhalten, ist, dass mit nur einem Argument arguments[1] nicht definiert ist.

Sie tun könnten als Richie legt nahe, und fügen Sie eine Zwischengröße, oder einfach nur beiden Argumente in einer einzigen bind passieren:

var FooBar = foo.bind(this, "hello", bar); 

Es ist wahrscheinlich eine gute Idee, auch kann so Ihre Funktion überprüft umfassen laufen zu Zeit erkennen wenn es sich um eine Funktion handelt. Dies erspart Ihnen die Sorge um die Reihenfolge der Argumente.

if(typeof func === 'function'){ 
    func(); 
}