9

次のコードをテストしてきましたが、Firefox16 と Chrome22 では結果が異なります。

console.log(this===window); //false in Firefox and true in Chrome
console.log(this.window===window); //true in both Firefox and Chrome
(function(){
    console.log(this===window); //false in Firefox and true in Chrome
    console.log(this.window===window); //true in both Firefox and Chrome
})();

私が覚えている限り、Chrome の答えは正しいです。 で呼び出されない限りnewthisはグローバル オブジェクト と常に同じでwindowあり、スコープ セーフ コンストラクターと呼ばれるパターンにつながります。

4

2 に答える 2

5

これはグローバルオブジェクトであると想定されていwindowますが、ES5までは、それを定義するための仕様はありませんでした。それは単なる慣習でした(つまり、「DOM0」の一部)。ES5§15.1には、のものがあります。

HTMLドキュメントオブジェクトモデルでは、グローバルオブジェクトのウィンドウプロパティはグローバルオブジェクト自体です

これは、少なくともECMAScript標準の非規範的な部分になっていると思います。

しばらくの間window、とグローバルオブジェクトの間にはあいまいさがありましたが、ほとんどの用途では、それらは同義でした。違いがあったのは特定の場合だけでした。

声明について:

newで呼び出されない限り、これは常にグローバルオブジェクトウィンドウと同じです。

全くない。関数のthisキーワードは、関数の呼び出し方法によって設定されます。非厳密モードで、実行コンテキストに入るときにnothisBindingが指定されている場合は、グローバルオブジェクトに設定されます。厳密モードでは、そのままになります(つまり、未定義、、、などnull0

これは、スコープセーフコンストラクターと呼ばれるパターンにつながります

それが何を意味するのかわかりません。関数thisはスコープとは何の関係もありません。演算子を関数呼び出しで使用するnewと、関数はコンストラクターとして機能し、のthisように作成された新しいオブジェクトに設定されnew Object()ます。newこれは、「スコープセーフコンストラクター」の概念というよりも、オペレーターの機能のようです。

于 2012-11-05T02:00:04.583 に答える
3

これは、実際には Firefox のWeb コンソール ドキュメント自体で回答されています。

注: Web コンソールを使用している間は、コンテンツで実行されているコードのようにオブジェクトでthisはありません。windowこれにより、コンテンツの名前空間を汚染することなく変数を作成できます。

于 2012-11-05T02:13:23.840 に答える