Ponieważ skrypt kawy nie ma varinstrukcji, 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 windowobiektu, zamiast tego jest exportsobiekt 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 exportsjest 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 exportsistnieje, 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 .callna funkcji spowoduje powiązanie thiswnętrza funkcji z pierwszym przekazanym parametrem, w przypadku przeglądarki thisbędzie teraz windowobiektem, w przypadku Node.js globalnym kontekstem, który jest również dostępny jako globalobiekt.
Ale ponieważ masz requirefunkcję w Node.js, nie ma potrzeby przypisywania czegoś do globalobiektu w Node.js, zamiast tego przypisujesz exportsobiekt, który następnie jest zwracany przez requirefunkcję.
Kawa-skrypt
Po tych wszystkich wyjaśnieniach oto, co musisz zrobić:
root = exports ? this
root.foo = -> 'Hello World'
Spowoduje to zadeklarowanie naszej funkcji foow globalnej przestrzeni nazw (cokolwiek się stanie).
To wszystko :)