不明なホスト環境でES5strictモードでグローバルオブジェクトへのハンドルを取得するための推奨される方法は何ですか?
ECMAScriptは、私が知っているグローバルオブジェクトを参照するための組み込みの方法を提供していません。もしそうなら、これは私が探している答えです。
既知の環境では、グローバルオブジェクトは通常自己参照プロパティを持っています。グローバルオブジェクトはグローバルスコープのVOであるため、グローバルオブジェクトのプロパティはグローバル変数であり、どこからでもグローバルオブジェクトへのハンドルを取得するために使用できます。
Webブラウザーでは、
window
またはを使用できますself
。node.jsでは、を使用できます
global
。
ただし、これは必ずしもすべてのホスト環境に当てはまるわけではありません。私の知る限り、WindowsScriptHostはグローバルオブジェクトにアクセスする方法を提供していません。WSHでグローバルオブジェクトを取得するための推奨される方法はthis
、オブジェクトに解決されないコンテキストでキーワードを使用することです。例えば:
var GLOBAL = (function(){return this}());
この手法は、どのホスト環境でも機能しますが、strictモードでは機能しません。これは、undefinedがstrictモードthis
でグローバルオブジェクトを参照しないためです。
これが厳密なモードコード内で評価される場合、この値はオブジェクトに強制変換されません。nullまたは未定義のこの値はグローバルオブジェクトに変換されず、プリミティブ値はラッパーオブジェクトに変換されません。関数呼び出し(Function.prototype.applyおよびFunction.prototype.callを使用して行われた呼び出しを含む)を介して渡されたこの値は、渡されたこの値をオブジェクト(10.4.3、11.1.1、15.3.4.3、15.3)に強制しません。 4.4)。
予想どおり、次のコードは次のようになりますundefined
。
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
では、 strictモードに関係なく、任意の環境でグローバルオブジェクトへのハンドルを取得する適切な方法は何ですか?
ちなみに、私の現在のアプローチは、次のようにグローバルオブジェクトを参照するグローバル変数をスニッフィングすることです。
var self, window, global = global || window || self;
...そして使用するだけglobal
です。これは多くの理由で悪い解決策だと思いますが、そのほとんどはかなり明白であり、WSHの問題に対処していません。