プロパティの解決は、識別子の解決とは根本的に異なります。些細な答えは、ECMA-262 では、存在しない変数を読み取ろうとするとエラーがスローされると指定されていますが、存在しないオブジェクト プロパティを読み取ろうとするとエラーがスローされず、特別な未定義の値が返されるだけです。
その理由を知るには、ECMA-262 のベースとなる JavaScript を最初に開発した Brendan Eich に聞く必要があります。しかし、妥当な推測として、ブレンダンは次のようなことをするのではなく、JavaScript を緩い型付けの単純な言語にしたいと考えていました。
if ( 'foo' in obj) {
/* do something with obj.foo */
}
初めてプロパティにアクセスするたびに、言語は未定義のプロパティへのアクセスを許容するようになりました。
一方、変数に同じアプローチを適用すると、解決するよりも多くの問題が発生するためtypeof
、識別子が存在するかどうかを確認するために使用できます。
if (typeof foo != 'undefined') {
/* ok to use foo */
}
それ以外の場合、プロパティと識別子の解決は非常に似ています。違いは、最初は内部[[Prototype]]
オブジェクトの文字列 (継承チェーン) に沿ってオブジェクトから進み、最後にnull
オブジェクトに進むのに対し、変数解決は外部コンテキスト (スコープ) に属する同様のオブジェクトの文字列に沿ってローカル変数オブジェクトから進むことです。 chain) をグローバル オブジェクトに追加します。