8

私は、すべてのグローバル変数がグローバル オブジェクトからアクセスできると信じていました。したがって、アクセスできるx(そしてxローカルにバインドされていない) 場合window.xは、同じ値です。

ただし、Webページ( JSFiddle )では:

window === this // true in Chrome and Firefox
toString === window.toString // true in Chrome and Firefox

しかし、コンソールで:

window === this // true in Chrome console and Firebug, false in Firefox web console
toString === window.toString // false in Chrome, Firebug and Firefox web console

どうしてこれなの?windowグローバル オブジェクトが Chrome のコンソールにあるのにtoStringにバインドされていないのはなぜwindow.toStringですか? toStringFirefox のコンソールでは何がバインドされていますか? コンソールで他に異なるグローバル値は何ですか?

4

3 に答える 3

3

toStringグローバル変数ではありません。オブジェクトを含むほとんどすべてのオブジェクトで共有されるメソッドwindowです。

実際のグローバル変数は、オブジェクトで常に使用できwindowます。

于 2013-01-04T15:46:01.310 に答える
2

おそらくこれはこの質問に関連していますか?それはすべて文脈に関連していると思います

toString.call("foo") == this.toString.call("foo")

しかし

tostring.call("foot") != window.toString.call("foo") when this != window
于 2013-01-04T15:53:37.277 に答える
1

Firefox であなたの主張を再現できません。彼らは両方とも戻ってきてい[xpconnect wrapped native prototype]ます。

これを解決するために、グローバルに利用できるものはすべて、グローバル オブジェクトを介して利用できます。ただし、必ずしもグローバルに使用できるとは限らない、グローバル オブジェクトを介して使用できるプロパティが存在する可能性があります。これは、Javascript のプロトタイプの継承パターンと、この状況の処理方法に関する仕様の欠如によるものです。

では、インタプリタは、グローバル オブジェクト チェーンのプロトタイプの継承を介してグローバル ルックアップを解決しようとするべきでしょうか? グローバル オブジェクトは他のオブジェクトから継承しますか? ここでは、さまざまな Javascript インタープリターが一貫していないと思いますが、ECMAScript の仕様に精通している人が参考になるかもしれません。

于 2013-01-04T16:06:44.057 に答える