グローバルにならない
CoffeeScriptでグローバル変数を期待して以下のように書いたとする。
1 2 3 |
globalVar = 1 # グローバル変数のつもり console.log(globalVar) |
一見すると問題なく動いているように見えるが、これを別ファイルのパッケージにして動かそうとすると問題が顕在化する。以下のように”globalVarが存在しないよ”というエラーが出るのである。
1 2 3 4 5 |
>>> package1.coffeeファイル globalVar = 1 >>> main.coffeeファイル console.log(globalVar) # globalVar is not defined |
これら2つのファイルをjsにコンパイルしてブラウザのscript要素で読み込んだ場合、そのイメージは以下のようになる。
1 2 3 4 5 6 7 8 |
(function() { globalVar a; globalVar = 1; }).call(this); (function() { console.log(globalVar); }).call(this); |
パッケージでグローバル定義したつもりだが、コンパイル時に無名関数でクロージングされるため、グローバルにならず、他のファイルから読み込むことができない。
解決策1
グローバル変数をwindow
オブジェクトの要素にしてしまう。
1 2 3 4 5 |
>>> package1.coffeeファイル window.globalVar = 1 >>> main.coffeeファイル console.log(window.globalVar) |
解決策2
rootコンテキストで、以下のパターンを使う。
1 2 3 4 5 6 |
>>> package1.coffeeファイル exports = this exports.globalVar = 1 >>> main.coffeeファイル console.log(globalVar) |