[解決済み] JavaScriptでグローバルオブジェクトを取得する方法は?
質問
あるスクリプトで、他のモジュールがすでにロードされているかどうかをチェックしたい。
if (ModuleName) {
// extend this module
}
しかし、もし
ModuleName
が存在しない場合、その
throw
s.
が分かっていれば
Global Object
がわかれば、それを使うことができるのに。
if (window.ModuleName) {
// extend this module
}
しかし、私は自分のモジュールを両方のブラウザで動作させたいので
node
,
rhino
などと仮定することはできません。
window
.
私の理解では、これはES 5では動作しません。
"use strict"
;
var MyGLOBAL = (function () {return this;}()); // MyGlobal becomes null
これも例外が投げられて失敗します
var MyGLOBAL = window || GLOBAL
ということで、残っているのは
try {
// Extend ModuleName
}
catch(ignore) {
}
これらのケースはいずれもJSLintを通過しません。
何か見逃していませんか?
どのように解決するのですか?
さて、あなたは
typeof
演算子を使用すると、識別子がスコープチェーンのどの場所にも存在しない場合、その識別子は
ではなく
を投げます。
ReferenceError
を返します。
"undefined"
:
if (typeof ModuleName != 'undefined') {
//...
}
また
this
の値は、グローバルオブジェクトを参照します。
if
ステートメントがグローバルコンテキストにある場合、単純に
this.ModuleName
.
について
(function () { return this; }());
のテクニックについてですが、おっしゃるとおり、ストリクトモードでは
this
の値は単に
undefined
.
ストリクトモードでは、どこにいてもグローバルオブジェクトへの参照を取得する方法が2つあります。
-
を通して
Function
のコンストラクタを使用します。var global = Function('return this')();
で作成された関数は
Function
コンストラクタで作成された関数は、呼び出し元の厳密性を継承せず、ボディを
'use strict'
ディレクティブで始まる場合のみストリクトで、それ以外は非ストリクトです。
このメソッドは、あらゆるES3実装と互換性があります。
-
を通して 間接的
eval
コール といった具合です。"use strict"; var get = eval; var global = get("this");
上記が動作するのは、ES5では、間接的な呼び出しを
eval
への間接的な呼び出しは
グローバル環境
をevalコードの変数環境と語彙環境の両方として使用します。
の詳細を参照してください。 評価コードの入力 をご覧ください。
しかし、最後の解決策はES3実装では動作しないことに注意してください。
eval
への間接的な呼び出しは、呼び出し元の変数と語彙環境をevalコード自体の環境として使用するからです。
そして最後に、ストリクトモードがサポートされているかどうかを検出するのに便利なことがあります。
var isStrictSupported = (function () { "use strict"; return !this; })();
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] JSHintの'+'前の改行不良の説明
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptでグローバル変数を宣言する方法
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] JavaScriptのオブジェクトをString変数でクラス名を定義して作成するには?