ES6ドラフトを自分で調べてみましたが、どこを見ればよいかわかりません。
this
ES6で必然的にグローバルオブジェクトを参照しているかどうかを誰かに教えてもらえますか?また、このオブジェクトにはグローバルスコープと同じメンバーがありますか?
ES5に答えることができれば、それも役に立ちます。
グローバルスコープthis
では、ブラウザやNodeなどの他のほとんどのES環境のグローバルオブジェクトを指します。それが仕様で定義された動作なのか、それとも実装者が追加した拡張動作なのか(そして、この動作がES6実装でも継続するのか)を知りたいだけです。さらに、グローバルオブジェクトは常にグローバルスコープと同じものですか?それとも違いはありますか?
更新-知りたい理由:基本的に、ES5および6でグローバルオブジェクトを確実に取得する方法を理解しようとしています。これwindow
はブラウザーに固有であるため信頼できません。またglobal
、環境に固有であるため信頼できません。ノードのように。this
Nodeでモジュールスコープで参照できることは知ってmodule
いますが、それでもglobal
グローバルスコープで参照できると思います。クロス環境ES5および6に準拠した方法で、グローバルオブジェクトを取得したい(可能な場合)。私がグローバルスコープで知っているすべての環境でそれが行われているように見えますthis
が、それが実際の仕様の一部であるかどうかを知りたいです(そして、私が慣れていない可能性のある環境全体で非常に信頼できます)。
また、グローバルスコープとグローバルオブジェクトが仕様で同じものであるかどうかも知る必要があります。言い換えると、グローバルスコープのすべての変数は?と同じになりglobalobject.variable_name
ますか?
アップデート2-私がやろうとしていること:
ES5環境用にいくつかのES6シムを開発しました。(1)ES6ビルトインがすでに存在するかどうかを確認して、可能な場合はシムの代わりに使用できるようにし、(2)シムをグローバルスコープに追加する(ビルドされている場合)ための最良の方法を知りたいです。 insはまだ存在していません。
現在、私はこのパターンに従っています:
(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
(これは、ビルトインをチェックする前にオーバーライドするためです。var
巻き上げる[少なくともナイーブなケースでは、おそらく私もステートメントを間接的にすることができますか?])eval
。var
コードをstrictモードで実行できるようにして、問題を悪化させたいと思います。
ES5仕様により、間接的eval
にグローバルスコープでコードを実行することを発見しました。だから私は少なくともそれをすることができます。私の質問はthis
、グローバルスコープに入る場合です。(1)そのオブジェクトのプロパティをチェックすると、ビルトインがグローバルスコープにすでに存在するかどうかがわかりますか?(2)そのオブジェクトにプロパティを追加すると、グローバルスコープに変数を追加できますか?