Оскільки сценарій кави не має жодного 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у глобальному просторі імен (що б там не сталося).
Це все :)