1. ホーム
  2. ジャバスクリプト

[解決済み】CoffeeScriptでグローバル変数を定義する方法は?

2022-03-28 16:24:26

質問

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);

Docsは言う。

他のスクリプトが使用できるように、トップレベルの変数を作成したい場合。 のwindowまたはexportsオブジェクトのプロパティとしてアタッチします。 CommonJSです。存在演算子(下記参照)で の両方をターゲットにしている場合、どこに追加すればよいかを確実に判断することができます。 CommonJSとブラウザ: root = exports ?

CoffeeScriptでグローバル変数を定義するにはどうしたらいいですか?ウィンドウのプロパティとしてアタッチする」とはどういう意味ですか?

どのように解決するのですか?

コーヒースクリプトには var 文は自動的にcoffee-scriptのすべての変数に挿入され、そうすることでコンパイルされたJavaScript版がすべてを グローバル名前空間 .

というわけで、quot;leak" に何かを漏らす方法はありません。 グローバル名前空間 のプロパティとしてグローバル変数を定義する必要があります。 グローバルオブジェクト .

ウィンドウのプロパティとして添付する

つまり、次のようなことをする必要があるのです。 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'; .

では、docsからの引用に書かれている内容を見てみましょう。

<ブロッククオート

...CommonJSとブラウザの両方をターゲットにする:root = exports ?

これは明らかにcoffee-scriptです。では、これが実際にどのようにコンパイルされるかを見てみましょう。

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 関数に何かを割り当てる必要はありません。 global オブジェクトに代入し、代わりに exports オブジェクトが返され、それが require 関数を使用します。

コーヒースクリプト

ここまで説明したら、次は何をすればいいのか、です。

root = exports ? this
root.foo = -> 'Hello World'

これは、関数を宣言するものです。 foo をグローバル名前空間 (それが何であろうと) で使用します。

以上です :)