coffee スクリプトにはステートメントがないvar
ため、coffee-script のすべての変数に対してステートメントが自動的に挿入されます。これにより、コンパイルされた 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 = exports ? これ
これは明らかにコーヒースクリプトなので、これが実際にコンパイルされるものを見てみましょう:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
最初にexports
が定義されているかどうかを確認します。JavaScript で存在しない変数を参照しようとすると SyntaxError が発生するためです ( で使用されている場合を除くtypeof
) 。
exports
存在する場合は、Node.js (または不適切に記述された Web サイトの場合) の場合、ルートは を指しexports
、そうでない場合はを指しthis
ます。それで、何this
ですか?
(function() {...}).call(this);
関数で使用すると、渡された最初のパラメーターに関数内.call
がバインドされます。ブラウザーの場合はオブジェクトになり、Node.js の場合は、オブジェクトとしても使用できるグローバル コンテキストになります。 this
this
window
global
ただし、require
Node.js に関数があるため、Node.js のオブジェクトに何かを割り当てる必要はありませんglobal
。代わりに、関数exports
によって返されるオブジェクトに割り当てます。require
コーヒースクリプト
すべての説明の後、次のことを行う必要があります。
root = exports ? this
root.foo = -> 'Hello World'
foo
これにより、関数がグローバル名前空間で宣言されます (それが何であれ)。
それで全部です :)