厳密モードで実行している場合、以前に宣言されていない変数へのアクセスは許可されません。したがって、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;
}