CoffeeScript でグローバル変数を定義するにはどうすればよいですか?
-
26-09-2019 - |
質問
Coffeescript.org で:
bawbag = (x, y) ->
z = (x * y)
bawbag(5, 10)
コンパイルすると次のようになります:
var bawbag;
bawbag = function(x, y) {
var z;
return (z = (x * y));
};
bawbag(5, 10);
Node.js で Coffee-script を介してコンパイルすると、次のようにラップされます。
(function() {
var bawbag;
bawbag = function(x, y) {
var z;
return (z = (x * y));
};
bawbag(5, 10);
}).call(this);
ドキュメントには次のように書かれています:
他のスクリプトを使用するためのトップレベルの変数を作成したい場合は、ウィンドウまたはcommonJSのエクスポートオブジェクトにプロパティとしてそれらを添付します。存在演算子(以下で説明します)は、 両方をターゲットにしている場合、それらを追加する場所を把握するための信頼できる方法 CommonJSとブラウザ:ルート = エクスポート ?これ
CoffeeScript でグローバル変数を定義するにはどうすればよいですか。「ウィンドウのプロパティとして添付する」とはどういう意味ですか?
解決
コーヒースクリプトには何もないので、 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 とブラウザの両方をターゲットにします:ルート = エクスポート ?これ
これは明らかにコーヒー スクリプトなので、実際にコンパイルするとどうなるかを見てみましょう。
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
関数でバインドします this
ブラウザの場合、関数内で最初のパラメータに渡されます。 this
今では window
オブジェクト。Node.js の場合は、 グローバルコンテキスト としても利用可能です global
物体。
しかし、あなたが持っているので、 require
Node.js の関数に何かを割り当てる必要はありません。 global
Node.js のオブジェクトの代わりに、 exports
によって返されるオブジェクト require
関数。
コーヒースクリプト
すべての説明が終わったら、次のことを行う必要があります。
root = exports ? this
root.foo = -> 'Hello World'
これにより関数が宣言されます foo
グローバル名前空間内 (それが何であれ)。
それだけです :)
他のヒント
私には@atomiculesは、最も単純な答えを持っているようだが、私はそれがより少しを簡素化することができると思います。あなたはそれが@
にコンパイルしthis.anything
はグローバルオブジェクトを参照するように、あなたがグローバルになりたい何でもする前にthis
を配置する必要があります。
そう...
@bawbag = (x, y) ->
z = (x * y)
bawbag(5, 10)
コンパイルに...
this.bawbag = function(x, y) {
var z;
return z = x * y;
};
bawbag(5, 10);
とのNode.js
によって与えられるラッパーの内側と外側を動作(function() {
this.bawbag = function(x, y) {
var z;
return z = x * y;
};
console.log(bawbag(5,13)) // works here
}).call(this);
console.log(bawbag(5,11)) // works here
イヴォはそれを釘付けしていますが、スタイルのポイントのつもりなら、私はそれをお勧めしませんが、私は、あなたが使用できる1つの汚いトリックがあることが言及されます:あなたはそれをエスケープすることにより、あなたのCoffeeScriptで直接JavaScriptコードを埋め込むことができますバッククォート付きます。
これは、通常は悪いアイデアである理由しかし、ここにあります:CoffeeScriptのコンパイラは、彼らがしますないオベイ通常のCoffeeScriptのスコープルールを意味し、それらの変数を認識しません。だから、
`foo = 'bar'`
foo = 'something else'
コンパイルに
foo = 'bar';
var foo = 'something else';
と、今、あなたは異なるスコープにてご自身で2 foo
sを持っています。修正する方法はありません。のグローバルのアイビーが説明するように、グローバルオブジェクトを参照することなく、CoffeeScriptのコードからfoo
ます。
もちろん、これはあなたがfoo
への割り当てを行う場合foo
は読み取り専用の初期値を与えた後に(それはグローバル定数のIE)になったのCoffeeScript-場合、埋め込まれたJavaScriptソリューションのアプローチはちょっとあるかもしれない唯一の問題ですみかん(まだ推奨されていないが)許容ます。
あなたは-bオプションを渡すことができます コンパイルされたコードは、coffeescript.org上と同じになります。
の
イヴォウェッツェルの答えに追加するには私は<のhref =「https://groups.google.com/forum/#!msg/coffeescript/PzNU0NtVY2c/zu_3kaG4nV4J」RELに言及/文書見つけることができることをexports ? this
の省略表現の構文があるようです= "nofollowをnoreferrer"> Googleのグループ投稿する
すなわち。機能可能なグローバルを作成するためのWebページでは、@
プレフィックスで再び関数を宣言ます:
<script type="text/coffeescript">
@aglobalfunction = aglobalfunction = () ->
alert "Hello!"
</script>
<a href="javascript:aglobalfunction()" >Click me!</a>
私は、あなたは、単に次のように行うことができます達成しようとしているものだと思います:
あなたがCoffeeScriptのコンパイルをしている間、 "-b" パラメータを使用します。
-b
/ --bare
のトップレベルの機能安全ラッパーなしでJavaScriptをコンパイルします。の
したがって、このような何か:coffee -b --compile somefile.coffee whatever.js
この意志の出力だけCoffeeScript.orgサイトのようにあなたのコードます。
(->@)()
:あなたは悪い人(。私は悪い人間だ)している場合は、、あなたはこのような単純なよう得ることができます
のように、
(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer
<時間>
この作品、Reference
にFunction
を呼び出すときに「裸」ので、(代わりにfunc()
またはnew func()
の、obj.func()
である)、何か一般に「関数呼び出し呼び出しパターン」と呼ばれる、の常にのバインドは<その実行コンテキストのグローバルオブジェクトにthis
/ A>。
上記のCoffeeScriptは単に(function(){ return this })()
にコンパイル。私たちはグローバルオブジェクトにアクセスし、確実にその行動を行使しています。
のCoffeeScriptはめったにそれは自分だ、あなたはglobal
変数のいずれかのNode.jsが提供またはbrowserify(およびcoffeeify、一気ビルドスクリプトなどのような任意の子孫)を使用することができます。
でのNode.js global
がグローバル名前空間です。
global
ではwindow
に等しい。
だから、ちょうど:
somefunc = ->
global.variable = 123