Ponieważ skrypt kawy nie ma var
instrukcji, automatycznie wstawia ją do wszystkich zmiennych w skrypcie kawy, w ten sposób zapobiega wyciekaniu skompilowanej wersji JavaScript do globalnej przestrzeni nazw .
Ponieważ więc nie ma sposobu, aby coś „wyciekło” do globalnej przestrzeni nazw od strony skryptów kawy celowo, musisz zdefiniować swoje zmienne globalne jako właściwości obiektu globalnego .
dołącz je jako właściwości do okna
Oznacza to, że trzeba zrobić coś podobnego window.foo = 'baz';
, który obsługuje sprawy przeglądarki, ponieważ tam globalny obiekt jest window
.
Node.js
W Node.js nie ma window
obiektu, zamiast tego jest exports
obiekt przekazywany do opakowania, które otacza moduł Node.js (patrz: https://github.com/ry/node/blob/master/src/node.js# L321 ), więc w Node.js musisz zrobić exports.foo = 'baz';
.
Teraz rzućmy okiem na to, co mówi w cytacie z dokumentów:
... atakując zarówno CommonJS, jak i przeglądarkę: root = eksportuje? to
Jest to oczywiście skrypt do kawy, więc przyjrzyjmy się temu, co to właściwie kompiluje:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Najpierw sprawdzi, czy exports
jest zdefiniowany, ponieważ próba odwołania się do nieistniejącej zmiennej w JavaScript dałaby w przeciwnym razie błąd SyntaxError (z wyjątkiem sytuacji, gdy jest używana z typeof
)
Więc jeśli exports
istnieje, co ma miejsce w Node.js (lub w źle napisanej witrynie WebSite ...), root wskaże exports
, w przeciwnym razie this
. Co to jest this
?
(function() {...}).call(this);
Użycie .call
na funkcji spowoduje powiązanie this
wnętrza funkcji z pierwszym przekazanym parametrem, w przypadku przeglądarki this
będzie teraz window
obiektem, w przypadku Node.js globalnym kontekstem, który jest również dostępny jako global
obiekt.
Ale ponieważ masz require
funkcję w Node.js, nie ma potrzeby przypisywania czegoś do global
obiektu w Node.js, zamiast tego przypisujesz exports
obiekt, który następnie jest zwracany przez require
funkcję.
Kawa-skrypt
Po tych wszystkich wyjaśnieniach oto, co musisz zrobić:
root = exports ? this
root.foo = -> 'Hello World'
Spowoduje to zadeklarowanie naszej funkcji foo
w globalnej przestrzeni nazw (cokolwiek się stanie).
To wszystko :)