2014-05-21 18 views
8

Ho il seguente codice di depennazione:Perché le esportazioni di un modulo devono essere dichiarate nella parte inferiore di un file?

module.exports = { 
    read: read, 
    write: write, 
}; 

var read = function(parameters, config, next) { 
    /* <snip> */ 
}; 

var write = function(parameters, config, next) { 
    /* <snip> */ 
}; 

Se vado a require() il file altrove, andrà in crash nodo e dire che l'oggetto desiderato non ha un metodo read o write. Il sollevamento variabile non estrarrà le funzioni sopra lo modules.export = { ... };?

risposta

14

È la sintassi utilizzata per dichiarare le funzioni importanti a causa di function hoisting. Se dichiarate queste funzioni in questo modo, verranno "sollevate" nello scope e tutto andrà bene.

module.exports = { 
    read: read, 
    write: write, 
}; 

function read(parameters, config, next) { 
    /* <snip> */ 
}; 

function write(parameters, config, next) { 
    /* <snip> */ 
}; 

Nota a margine: funzioni Named come nel mio frammento, al contrario di funzioni anonime assegnati alle variabili come nel tuo frammento, sono più facili da eseguire il debug e il profilo, perché il loro nome viene incluso in stack.

+0

Perché una variabile non viene issata sopra gli incarichi 'module.exports'? 'Module' è un oggetto nodo speciale che viene dichiarato e issato prima che venga eseguito il rendering di qualsiasi altro codice nel file? – Scott

+1

Le variabili non vengono issate. Chiamate semplicemente funzioni dichiarate senza "var". –

+3

Ahhh, è tornato indietro e ha riletto il tuo articolo collegato. La dichiarazione della variabile viene issata, ma il valore (nel mio caso una funzione) non viene assegnato fino a un momento successivo, mentre una funzione con nome verrà issata insieme alla sua logica. Gotchya. – Scott

Problemi correlati