2013-06-16 13 views
6

Ho una funzione in javascriptassociare una funzione ad un'altra funzione in javascript

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

e un'altra funzione

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

e voglio fare una funzione FooBar

FooBar = foo.bind(this, bar); 

Questo funziona bene, tuttavia quello che sto effettivamente cercando di fare è creare un function queue, e spesso it dovrò associare un parametro di nessuno funzione prima associazione di un callback, come nel seguente esempio

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

che produce questo errore

[Function: bar] 

TypeError: undefined is not a function 

Come può un mi legano una funzione ad un'altra funzione, una volta è stato associato ad altri tipi di funzioni?

risposta

5

Stai vincolante "Hello"-foo, e poi separatamente vincolante bar-foo come pure - non dovresti legare bar al risultato del primo bind, in questo modo:

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

Fiddle here. (che registra "Ciao mondo").

+0

Per un esempio meno complesso, vedere http://jsfiddle.net/XM4kQ/8/. e leggi su bind qui https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind come l'esempio con cui si collega questo violino fa sembrare che tu sia effettivamente una barra vincolante per un legame di foo ... – mschuett

4

Il metodo bind non associa le funzioni tra loro, lo scopo è quello di correggere il contesto della parola chiave "this" e di eventuali argomenti quando viene chiamata la funzione. Quindi restituisce una nuova funzione, lasciando l'originale invariato.

Quindi: foo.bind(this, "hello") non ha alcun effetto. Chiamare il binding la seconda volta crea una nuova funzione con un argomento fisso di bar. Il motivo per cui si verifica un errore è dovuto al fatto che con un solo argomento passato, arguments[1] non è definito.

Si potrebbe fare come suggerisce Richie e aggiungere una variabile intermedia, o semplicemente passare entrambi gli argomenti in un unico vicolo cieco:

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

E 'probabilmente una buona idea anche includono gestita tempo controllando così la funzione può rilevare quando si tratta di una funzione. Questo ti farà risparmiare sull'argomento ordine.

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