0

私は次のコードを持っています:

"use strict";

function isDefined(variable)
{
    return (typeof (window[variable]) === "undefined") ? false : true;
} 

try
{
    isDefined(isTrue);
}
catch (ex)
{
    var isTrue = false;
}

isTrue = true;

キーワード「var」を削除すると例外がスローされるのに、それが存在する場合は未定義のように扱われる理由を誰かに説明してもらえますか?

4

1 に答える 1

3

厳密モードで実行している場合、以前に宣言されていない変数へのアクセスは許可されません。したがって、isTrueアクセスする前に宣言する必要があります。したがって、そのvar前にある を削除し、他の場所で宣言されていない場合、それはエラーになります。

strict モードの MDN ページからの引用:

まず、厳密モードでは、誤ってグローバル変数を作成することができなくなります。通常の JavaScript では、代入で変数のタイプを間違えると、グローバル オブジェクトに新しいプロパティが作成され、引き続き「機能」します (ただし、将来的に失敗する可能性がありますが、最近の JavaScript では可能性が高いです)。誤ってグローバル変数を作成する代入は、厳密モードでスローされます。

あなたの質問の部分はundefinedもう少し複雑です。コンパイラによって変数宣言が宣言されているスコープの先頭にホイストされる変数ホイストのため、varステートメントを含むコードは次のようになります。

var isTrue;
try
{
    isDefined(isTrue);
}
catch (ex)
{
    isTrue = false;
}

isTrue = true;

したがって、 を呼び出すとisDefined(isTrue)、 の値はisTrueですundefined。宣言されていますが、初期化されていないため、値はundefinedです。varステートメントがない場合isTrue、厳密モードでの参照はまだ宣言されていないため、エラーになります。

変数にまだ値があるかどうかを知りたい場合は、次のように簡単に実行できます。

if (typeof isTrue != "undefined") {
    // whatever code here when it is defined
}

または、まだ初期化されていない場合に値があることを確認したい場合は、次のようにします。

if (typeof isTrue == "undefined") {
    var isTrue = false;
}
于 2012-04-01T09:39:06.273 に答える