CoffeeScript でグローバル変数を定義するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4214731

  •  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 foosを持っています。修正する方法はありません。のグローバルのアイビーが説明するように、グローバルオブジェクトを参照することなく、CoffeeScriptのコードからfooます。

もちろん、これはあなたがfooへの割り当てを行う場合fooは読み取り専用の初期値を与えた後に(それはグローバル定数のIE)になったのCoffeeScript-場合、埋め込まれたJavaScriptソリューションのアプローチはちょっとあるかもしれない唯一の問題ですみかん(まだ推奨されていないが)許容ます。

あなたはnode.js.の下でコーヒースクリプトを経由してコードをコンパイルするときに

あなたは-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
<時間>

この作品、ReferenceFunctionを呼び出すときに「裸」ので、(代わりにfunc()またはnew func()の、obj.func()である)、何か一般に「関数呼び出し呼び出しパターン」と呼ばれる、の常にのバインドは<その実行コンテキストのグローバルオブジェクトにthis / A>。

上記のCoffeeScriptは単に(function(){ return this })()にコンパイル。私たちはグローバルオブジェクトにアクセスし、確実にその行動を行使しています。

のCoffeeScriptはめったにそれは自分だ、あなたはglobal変数のいずれかのNode.jsが提供またはbrowserify(およびcoffeeify、一気ビルドスクリプトなどのような任意の子孫)を使用することができます。

で使用されていないので、

でのNode.js globalがグローバル名前空間です。

browserify global

windowに等しい。

だから、ちょうど:

somefunc = ->
  global.variable = 123
scroll top