私はES6で自分をドラフト探してみましたが、私は見てどこか分からない:`ECMAScriptの中にグローバルスコープのthis` 6
ES6でthis
は必ずしもグローバルを参照している場合、誰かが私に言うことができますオブジェクト?また、このオブジェクトはグローバルスコープと同じメンバを持つでしょうか?
もしあなたがES5のために答えることができればそれも役に立つでしょう。
グローバルスコープ内のthis
は、ブラウザやその他のほとんどのES環境(ノードなど)のグローバルオブジェクトを指しています。私はそれが仕様によって定義された振る舞いか、それが実装者が追加した拡張動作(そしてこの振る舞いがES6の実装で継続するかどうか)であるかどうかを知りたいだけです。さらに、グローバルオブジェクトは常にグローバルスコープと同じですか?または区別がありますか?
アップデート - なぜ私が知りたい:私は基本的に確実にES5 &それがブラウザに固有のだから、私はwindow
に頼ることはできません6.でグローバルオブジェクトを取得する方法を把握しようとしています、 global
に依存することもできません。これは、ノードなどの環境に固有のものであるためです。私はNode内のがモジュールスコープのmodule
を参照できることを知っていますが、それでもグローバルスコープのglobal
を参照していると思います。グローバルオブジェクト(可能な場合)を取得するには、クロス環境ES5 & 6準拠の方法が必要です。グローバルスコープのthis
が知っているすべての環境のようですが、実際の仕様の一部であるかどうかを知りたいと思います。
また、グローバルスコープとグローバルオブジェクトが仕様によって同じものかどうかを知る必要があります。つまり、グローバルスコープ内のすべての変数はglobalobject.variable_name
と同じになりますか?
アップデート2 - 私は何をしようとしている:
私はいくつかのES6 shims for ES5 environmentsを開発しました。 (1)シムの代わりに可能なときに使用できるようにES6ビルトインがすでに存在するかどうかを確認し、(2)シムをグローバルスコープに追加するには、既に存在していません。
現在、私はこのパターンを次のようだ:
(function() {
// Indirect eval to run in global scope.
// (We get whatever "this" is in global scope, hoping that it's the global object...
// Whether this line does what I want it to is the crux of my question.)
var global = (0, eval)('this');
// If Symbol does not already exist in global scope,
if (!global.Symbol)
// Then add Symbol to global scope.
global.Symbol = (function() {
// ...
// Return my Symbol shim
})();
})();
あり(1)のためのいくつかの他の可能性がありますが、一日の終わりに私はvar
を使用せずにグローバルスコープに何かを追加する方法が必要ですグローバルスコープ(これは、少なくとも私が間接的にeval
var
ステートメントも間接的に可能性がありますか?))のために、私はそれらをチェックする前に内蔵型をオーバーライドするので、var
ホイストすることができます。私は自分のコードを厳密なモードで実行できるようにして、コンパウンドが問題になるようにします。
私は、ES5仕様では、間接的なeval
がグローバルスコープでコードを実行することを発見しました。だから私は少なくともそれを行うことができます。私の質問は、グローバルスコープでを取得した場合です。(1)そのオブジェクトのプロパティをチェックすると、ビルトインがすでにグローバルスコープに存在するかどうかがわかりますか? (2)そのオブジェクトにプロパティを追加すると、グローバルスコープに変数を追加できますか?
「this」はES6固有ではないため、以前のES仕様と同様に動作するはずです。 'this'の意味は、それがどこで使われているかによって異なり、常にグローバルオブジェクトではありません。 – Jay
。だから、私は "グローバルスコープ"に尋ねました。ブラウザでは、 "this"はグローバルオブジェクトでもある 'window'と同じです。しかし、これがESで指定されているのか、それともその言語のブラウザ拡張機能なのかは分かりません。 –
あなたがSESのようなものにいない限り、間接的なevalトリックは確実に機能します。グローバルオブジェクトがあればそれに割り当ててプロパティをチェックすることができます。これにより、必要な処理が実行されます。 es6では、let、constなどについてAndreasが言ったことを超えて、主要なグローバルオブジェクトを外部スコープとする独自のプライベートグローバルを持つモジュールの問題もあるため、直接参照がない限り外部グローバルにアクセスしたり変更することは不可能です(例えば 'global'を自動的に定義するnode.jsのように、あなたはその外側のグローバルへの参照を与えます)。 –