2013-06-24 11 views
5

Come si può definire una coppia di funzioni che si richiamano in Javascript, in modo che JS-lint non si lamenta del fatto che "fattoriale" viene utilizzato prima di essere definito?riferimenti circolari tra le funzioni javascript

function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

Sembra che non ci sia un ordine valido che soddisfi JSlint. (Uno può essere incorporato nell'altro, ma questo sarebbe un incubo per una raccolta di funzioni che si chiamano a vicenda).

Sicuramente questo è gestito dal linguaggio giusto? Questo è solo un bug in JSlint? (Questa domanda deve avere risposta da qualche parte, ma non riesco a trovarla!)

+0

Probabilmente intendevi 'n === 0? 1: ... '. Inoltre, cosa non funziona (tranne l'errore logico che ho già indicato)? – Dogbert

+0

>> Sicuramente questo è gestito dalla lingua giusta? Generalmente dopo qualche tempo la pagina non risponde e il browser visualizza un avviso popup che chiede di interrompere lo script o lasciarlo continuare. – mohkhan

+0

@dobert sì, la tua modifica è corretta. ma il vero problema è che JSlint si lamenta del fatto che "factorial" sta facendo riferimento prima che venga definito. –

risposta

6

I riferimenti all'interno delle funzioni non vengono risolti fino a quando non vengono eseguiti. Finché entrambe le funzioni sono state definite dal momento in cui uno di loro viene eseguito, si troveranno a vicenda.

Se si vuole sbarazzarsi del l'avviso JSLint, è possibile definire il nome della funzione, poco prima:

var factorial; 
function factorial1(n) { return factorial(n); } 
function factorial(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 
+0

Mi spiace di non aver chiarito che il problema è che JS-lint si lamenta. –

+0

Grazie! ovviamente. Non ho pensato di mixare in una funzione var con le funzioni con nome! –

0

preferisco questa sintassi per le funzioni:

var factorial1 = function(n) { return factorial(n); } 
var factorial = function(n) { return n === 0 ? 1 : n * factorial1(n - 1); } 

non Will essere in grado di dimenticare di "dichiarare" la funzione con questa sintassi.

+0

Tutte le istruzioni devono essere terminate con punto e virgola. Non è un grosso problema qui, ma potrebbe causare problemi se hai copiato queste affermazioni. –

Problemi correlati