5

ES6ドラフトを自分で調べてみましたが、どこを見ればよいかわかりません。

thisES6で必然的にグローバルオブジェクトを参照しているかどうかを誰かに教えてもらえますか?また、このオブジェクトにはグローバルスコープと同じメンバーがありますか?

ES5に答えることができれば、それも役に立ちます。

グローバルスコープthisでは、ブラウザやNodeなどの他のほとんどのES環境のグローバルオブジェクトを指します。それが仕様で定義された動作なのか、それとも実装者が追加した拡張動作なのか(そして、この動作がES6実装でも継続するのか)を知りたいだけです。さらに、グローバルオブジェクトは常にグローバルスコープと同じものですか?それとも違いはありますか?


更新-知りたい理由:基本的に、ES5および6でグローバルオブジェクトを確実に取得する方法を理解しようとしています。これwindowはブラウザーに固有であるため信頼できません。またglobal、環境に固有であるため信頼できません。ノードのように。thisNodeでモジュールスコープで参照できることは知って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巻き上げる[少なくともナイーブなケースでは、おそらく私もステートメントを間接的にすることができますか?])evalvarコードをstrictモードで実行できるようにして、問題を悪化させたいと思います。

ES5仕様により、間接的evalにグローバルスコープでコードを実行することを発見しました。だから私は少なくともそれをすることができます。私の質問はthis、グローバルスコープに入る場合です。(1)そのオブジェクトのプロパティをチェックすると、ビルトインがグローバルスコープにすでに存在するかどうかがわかりますか?(2)そのオブジェクトにプロパティを追加すると、グローバルスコープに変数を追加できますか?

4

2 に答える 2

2

はい、thisグローバルスコープでは引き続きES6のグローバルオブジェクトを参照します。(一般に、ES6は完全な下位互換性があると想定されています。つまり、ES5で動作することが保証されているコードはすべてES6でも動作するはずです)。

ただし、「グローバルスコープ」の概念は、ES6のグローバルオブジェクトと同じではなくなります。字句スコープ( 、、、、、およびその他いくつか)の新しいlet宣言フォームが導入されています。前回の会議での結論は、これらのいずれもグローバルオブジェクトのプロパティとして表示されないということでした。これにはさまざまな技術的および方法論的な理由がありますが、肝心なのは、グローバルオブジェクトを直接使用しないことが最善であるということです(これは常に当てはまりますが、ES6ではさらに当てはまります)。constclassmodule

グローバルオブジェクトが必要な特定の何かがありますか?

于 2012-11-17T09:54:03.923 に答える
0

ほとんどそうです。

this非オブジェクト(または非セット)を渡すthisと、グローバルオブジェクトが参照されます。

(function( global ){ /* do stuff! */ }(this));

この動作は、ES6にとどまるように意図されています(理解しやすい下位互換性の問題のため)。そして、それが私が知っているマルチプラットフォーム(ブラウザ/ノード)プラグインのほとんどがグローバルオブジェクトにアクセスしている方法です。例:https ://github.com/documentcloud/underscore/blob/master/underscore.js#L12

ただし、サーバー上のプラグインは(エクスポートさthisれた)存在としてのみアクセスするのは事実です。moduleしかし、それはあなたがノードに望むものです。グローバルスペースはこれまでクリーンアップされません(手動またはサーバーの再起動時を除く)。したがって、すべてのクライアント接続間で共有されます。グローバルスペースに何かを割り当てることは、実際には良い考えではありません。


thisjavascriptの「バージョン」間の処理方法の唯一の顕著な違いはstrict modeにあります。エラーがスローされるのは、またはがまたはに渡されるかどうnullundefinedですcallapplybind位置にありますthis value)。非厳密モードでthisは、グローバルオブジェクトにのみ強制されました。

"use strict";
foo.apply(null); // Throw error

この助けを願っています!

于 2012-11-17T05:32:00.693 に答える