2013-10-11 4 views
14

存在しない変数を参照しようとすると、JavaScriptでReferenceErrorが返されます。存在しないオブジェクトプロパティを参照すると、なぜ 'undefined'が返されますか?javascriptでオブジェクトの存在しないプロパティを参照しても参照エラーが返されないのはなぜですか?

alert(a); 
ReferenceError: a is not defined //error is thrown 
alert({}.a) 
undefined //no error 
+0

コードを投稿できますか?もし私がギャンブルの男だったら、それは存在するが、空でも空でもあると言うだろう。コンソールでデバッグしましたか? –

+4

なぜその言語がそのように設計されているのか尋ねていますか? @MikeHometchko - 私はあなたの賭けを取っています:存在しないプロパティは 'undefined'を返すのに対し、' null'は 'null'を返します(空の場合は空の文字列を返します。空の文字列);存在するが 'undefined 'という値が割り当てられたプロパティも' undefined'を返します。 – nnnnnn

+0

@nnnnnn私は彼がだと思う... –

答えて

9

言語が動作するだけで方法は次のとおりです。ここで は、私は、ブラウザでそれを書いて提供するいくつかのコードです。オブジェクトベースのアプローチは非常に柔軟で、実行時にオブジェクトからプロパティを動的に追加、更新、削除できます。現在存在していないものにアクセスすると、例外が発生する代わりにundefinedが返されます。たとえば、次のように1つの式で存在と型をチェックすることができます。

if (prop in obj && typeof obj[prop] == "function") obj[prop](); 
// can be written shorter: 
if (typeof obj[prop] == "function") obj[prop](); 

値を使用せずに取得できます。 undefinedを使用すると、ほとんどの場合スローされます。

対照的に、変数はスコープ内で静的に宣言されます。宣言されていない変数にアクセスすると、が常にのエラーとなり、ReferenceErrorがスローされます。

+0

ありがとうございますが、私はそれをすべて知っています。私は、例えば、 'delete'演算子を使ってカスタムオブジェクトの特質を削除することができ、変数や関数を削除することができないような、「裏側の」プロセスに興味があります。(http://perfectionkills.com/understanding -delete /) –

+2

そのためには、[ECMAScriptの仕様](http://ecma-international.org/ecma-262/5.1/)、具体的にはオブジェクトのセクション8.6,8.7および8.12、 .1と11.4.1、変数とスコープについては10 [.2]です。しかし、この仕様では*なぜ*、*というだけのことを説明していません。 – Bergi

+2

"ReferenceError"はstrictモードでのみ存在することに注意してください。厳密モードの変更の要約は、[Annex C](http://www.ecma-international.org/ecma-262/5.1/#sec-C)にあります。厳密なモードは、解決できない参照を制限します。オブジェクトプロパティは解決できない参照ではありません。 –

関連する問題