2014-05-21 12 views
8

Mam następujący kod redacted:Dlaczego należy eksportować moduł na dole pliku?

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

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

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

Jeśli pójdę do require() ten plik w innym miejscu, to awarię węzła i powiedzieć, że żądany obiekt nie ma metody read lub write. Czy zmienne podciąganie nie pociągnęłoby funkcji powyżej modules.export = { ... };?

Odpowiedz

14

Jest to składnia używana do deklarowania funkcji, które są ważne z uwagi na function hoisting. Jeśli zadeklarujesz te funkcje w ten sposób, zostaną one "podniesione" w zakresie i wszystko będzie dobrze.

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

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

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

marginesie: nazwane funkcje, takie jak w moim fragmencie, w przeciwieństwie do anonimowych funkcji przypisanych do zmiennych jak we fragmencie, są łatwiejsze do debugowania i profilu, ponieważ ich nazwa zostaje włączone w ślady stosu.

+0

Dlaczego zmienna nie zostanie podniesiona powyżej przypisania 'module.exports'? Czy 'module' jest specjalnym obiektem węzła, który zostaje zadeklarowany i podniesiony przed renderowaniem jakiegokolwiek innego kodu w pliku? – Scott

+1

Zmienne nie zostaną podniesione. Tylko nazwane funkcje zadeklarowane bez "var". –

+3

Ahhh, wróciłem i ponownie przeczytałem twój połączony artykuł. Deklaracja zmiennej jest podnoszona, ale wartość (w moim przypadku funkcja) jest przypisana dopiero później, podczas gdy nazwana funkcja zostanie podniesiona wraz z jej logiką. Gotchya. – Scott