Оскільки сценарій кави не має жодного var
твердження, він автоматично вставляє його для всіх змінних у кавовий скрипт, таким чином він перешкоджає складеній версії JavaScript не проникати все у глобальний простір імен .
Отже, оскільки немає ніякого способу зробити щось «просочене» у глобальний простір імен зі сторони речей, що стосуються кавового сценарію, вам потрібно визначити свої глобальні змінні як властивості глобального об’єкта .
прикріпити їх як властивості на вікні
Це означає, що вам потрібно зробити щось на зразок window.foo = 'baz';
, що обробляє корпус браузера, оскільки там глобальним об'єктом є window
.
Node.js
У Node.js немає жодного window
об’єкта, натомість є exports
об’єкт, який передається в обгортку, яка обгортає модуль Node.js (Див. Https://github.com/ry/node/blob/master/src/node.js# L321 ), тому в Node.js вам потрібно буде це зробити exports.foo = 'baz';
.
Тепер давайте подивимось на те, що йдеться у вашій цитаті з документів:
... націлена на CommonJS і браузер: root = експортувати? це
Це, очевидно, сценарій кави, тому давайте розберемося, до чого це насправді складається:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Спочатку він перевірить, чи exports
визначено, оскільки спроба посилання на неіснуючу змінну в JavaScript інакше призведе до SyntaxError (за винятком випадків, коли він використовується з typeof
)
Отже, якщо exports
існує, що стосується кореня Node.js (або з погано написаним веб-сайтом ...), вкаже на exports
інше this
. Так що ж this
?
(function() {...}).call(this);
Використання .call
функції прив'язує this
внутрішню функцію до першого переданого параметра, у випадку, коли браузер this
буде window
об'єктом, у випадку Node.js це буде глобальний контекст, який також доступний як global
об'єкт.
Але оскільки у вас є require
функція в Node.js, немає необхідності присвоювати щось global
об'єкту в Node.js, натомість ви призначаєте exports
об'єкт, який потім повертається require
функцією.
Кава-скрипт
Після цього пояснення, ось що вам потрібно зробити:
root = exports ? this
root.foo = -> 'Hello World'
Це оголосить нашу функцію foo
у глобальному просторі імен (що б там не сталося).
Це все :)