[解決済み】CoffeeScriptでグローバル変数を定義する方法は?
質問
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
をグローバル名前空間 (それが何であろうと) で使用します。
以上です :)
関連
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み】Uncaught TypeError: 未定義のプロパティ 'msie' を読み取れない - jQuery tools
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み】中央値の計算 - javascript