2011-09-11 5 views
6

Najłatwiej wyjaśnić z kodem:Moduły węzła - eksportowanie zmiennej w zależności od funkcji eksportu, które ją odwołują?

##### module.js 
var count, incCount, setCount, showCount; 
count = 0; 

showCount = function() { 
return console.log(count); 
}; 
incCount = function() { 
    return count++; 
}; 
setCount = function(c) { 
    return count = c; 
}; 

exports.showCount = showCount; 
exports.incCount = incCount; 
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself 

#### test.js 
var m; 
m = require("./module.js"); 
m.setCount(10); 
m.showCount(); // outputs 10 
m.incCount(); 
m.showCount(); // outputs 11 
console.log(m.count); // outputs 0 

Eksportowane funkcje działają zgodnie z oczekiwaniami. Ale nie jestem jasne, dlaczego m.count nie jest również 11.

Odpowiedz

13

exports.count = count

czy ustawienie właściwości count na obiekcie exports być wartość count. To znaczy. 0.

Wszystko jest przekazywane przez wartość, która nie przechodzi przez odniesienie.

Jeśli było określić count jako getter jak takie:

Object.defineProperty(exports, "count", { 
    get: function() { return count; } 
}); 

Następnie exports.count zawsze Zwraca bieżącą wartość count a zatem 11

+2

Nie wszystko przekazuje się według wartości! Funkcje i obiekty są zawsze przekazywane przez odniesienie. – zetlen

+2

@zetlen nie są przekazywane wartością. Wartość, którą przekazują, jest odniesieniem do obiektu. Przekazywanie przez odniesienie to wskaźniki. Nie mamy żadnych wskazówek. – Raynos

0

Popraw mnie jeśli się mylę, ale liczbach są niezmienne typy. Po zmianie wartości count zmienia się również odniesienie. Tak więc exports.count odnosi się do starej wartości count.

0

W języku JavaScript funkcje i obiekty (w tym tablice) są przypisywane do zmiennych przez odniesienie, a łańcuchy i liczby są przypisywane przez wartość - czyli przez tworzenie kopii. Jeśli var a = 1 i var b = a i b++, a nadal będzie równa 1.

Na tej linii:

exports.count = count; // let's also export the count variable itself 

zrobiłeś kopię przez wartość zmiennej count. Operacje setCount(), incCount() i showCount() działają na zmiennej count wewnątrz zamknięcia, więc konto m.count nie zostanie ponownie dotknięte. Gdyby te zmienne działały na this.count, otrzymalibyśmy oczekiwane zachowanie - ale prawdopodobnie i tak nie chcemy eksportować zmiennej count.

+0

"przez odniesienie" oznacza wskaźniki. Gdzie są te wskaźniki, które mamy w javascript? – Raynos

+1

Wystarczająco fair. Jaka byłaby różnica między przypisaniem obiektu/przypisaniem funkcji a przypisaniem ciągów? Nie, to nie jest dosłowne miejsce w pamięci, ale dwa odniesienia do obiektu zmodyfikują lub wyświetlają ten sam obiekt, co nie jest prawdą w przypadku ciągu znaków. Jak to nazywasz? – zetlen

+1

@zetlen, ten artykuł zwięźle odpowiada na twoje pytanie: https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions. Zasadniczo wszystkie funkcje JavaScript przechodzą na wartości. Interesujące pytanie brzmi: jaką wartość przechodzą? W przypadku typów pierwotnych jest to układ podstawowy, a w przypadku typów niepochodzących pierwotny jest to obiekt lokalny. – Thierry

Powiązane problemy