4

ウィンドウにプロパティが存在するかどうかを確認したいので、次のようにしました。

このコードは機能します:

if (window.foo) {
    alert("exists");
}
else {
    alert("doesn't exist");
}

出力:

存在しません

次のコードも機能するはずだと思いました。変数を定義し、関数内にいない場合、変数は「ウィンドウ」オブジェクトのプロパティとして作成されるため、これは同等である必要があります。

if (foo) { //it fails here "foo is not defined"
    alert("exists");
} else {
    alert("doesn't exist");
}

驚いたことに、うまくいきませんでした。私の質問は、ウィンドウを先頭に追加しないと機能しないのはなぜですか?

4

2 に答える 2

7

最初のバージョンはプロパティ アクセスです。プロパティが見つからないため、undefined が返されます。2 つ目は、 undefined variable にアクセスしようとしています。

elclans が提案したものを使用します。

if(typeof foo === "undefined"){
    alert("exists");
} else {
    alert("doesn't exist");
}

なんで?

これはGetValue、言語仕様で指定されているためです。

.3. IsUnresolvableReference(V) の場合、ReferenceError 例外をスローします。

これは、以前に定義されていなかったif(foo)ため、この場合に発生することです。foo

一方、オブジェクトの場合は次のようになります。

  1. base を GetBase(V) を呼び出した結果とする。
  2. O を ToObject(base) とします。
  3. プロパティ名 P で O の [[GetProperty]] 内部メソッドを呼び出した結果を desc とする。
  4. desc が定義されていない場合は、undefined を返します。

したがって、偽window.fooの原始言語の値undefinedを返します。

于 2013-07-03T22:26:04.073 に答える