2012-04-11 9 views
6

javascriptwindowはグローバルオブジェクトです。グローバルスコープ内のすべてのオブジェクトがwindowの子であることを意味します。ReferenceErrorとグローバルオブジェクト

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

これらの2行は、彼らいけない、同じでなければなりません:だから、なぜ私はこの結果を得ますか?

答えて

17

fooプロパティはwindowという明示的に後者のオプションではないオブジェクトを探しているためです。後者のオプションでは、fooが定義されていない場合、開発者は、定義されていないことを知ることができ、インタプリタではなく明確なエラー警告を得て、undefined(それは最初のケースのように) 〜予期しない結果。

Reference Error

存在しない変数が参照されたエラーを表します。 宣言されていない変数を逆参照しようとすると、ReferenceErrorがスローされます。

詳細は、この記事を見てみましょう:

A参照が解決できないと考えられている場合はその基本値:記事の上からの引用

を定義されていません。したがって、ドットの前の値が未定義である場合、プロパティ参照は解決できません。次の例ではReferenceErrorがスローされますが、TypeErrorが最初に取得されるため、ReferenceErrorはスローされません。これは、プロパティの基本値が、未定義型をオブジェクトに変換しようとするときにTypeErrorをスローするCheckObjectCoercible(ECMA 5 9.10〜11.2.1)の対象であるためです。

例:どちらのプロパティまたは変数です

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

参照定義によって解決不可能であり、だから、にReferenceErrorがスローされます。JavaScriptで

foo; //ReferenceError 
2

最初の例(window.foo)では、ウィンドウオブジェクトのプロパティにアクセスしています。 JavaScriptは、オブジェクトの存在しないプロパティにアクセスしようとしているときに「未定義」を返します。そのように設計されています。

2番目の例では、変数を直接参照していますが、存在しないためエラーが発生します。

これは、JavaScriptが設計されて動作する方法です。

1

割り当てることができますそのようなフライでオブジェクトフィールド、したがってwindow.fooです(ほぼ以下のコメントを参照してください)グローバルコンテキストで定義されている場合、と同じですが、青色からfooを呼び出すだけでブラウザのパニックが発生するため、どのオブジェクトを表示するかわからなくなります。

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo'は' var foo'と等価ではありません。 –

+0

@TimDown。もう少し詳しく教えていただけますか?多分答えに? – gdoron

+0

@TimDown&@gdoronさて、それはちょっと間違っています - 私が意味していたのは、グローバルコンテキストで宣言されたとき、window.fooは 'var foo'と同じです。 – JKing

関連する問題