8

私はこのコードを見つけました:

if (!("aa" in window)) {  
    alert('oh my god');
    var aa = 1;  
}  
alert("aa" in window);
alert(aa);

このコードでは、2 番目のアラートはアラートtrueですが、3 番目のアラートは「未定義」であり、「if」のアラートは実行されません。なんで?

その理由は次のとおりだと思いますin。その効果は何ですか?

Google で検索しましたが、何も見つかりませんでした。フィルターワードです。

私たちは常にinin ループを使用していますが、率直に言って、私はそれを使用していますが、あまり理解していません。

4

3 に答える 3

16

windowこれは、キーが であるプロパティ (塗りつぶされているかどうか) がオブジェクトにあるかどうかをテストします"aa"

undefinedこの演算子は、値が次の場合でも機能するため、非常に便利です。

window.aa = undefined; // or just aa=undefined if you're in the global scope
console.log('aa' in window); // logs true

プロパティが列挙可能でない場合にも機能します。

console.log('length' in []); // logs true

あなたの場合、aa値がないかもしれませんが、アラートが true を示している場合、プロパティは に追加されましたwindow

の MDN リファレンス

このステートメントは、実際には演算子for...inを使用せず、特定の構造であるという点で異なることに注意してください。in

for...in の MDN リファレンス


編集:編集した質問の説明(最初のものとは非常に異なります):

var aa = 1;あなたの混乱は、ブロック内で宣言したという事実から生じているようです。JavaScript の変数のスコープは、グローバル スコープの関数であり、宣言が巻き上げられることを知っておく必要があります。したがって、あなたのコードは実際には次と同等です

var aa = undefined;
if (!("aa" in window)) { // aa is in window, so we don't enter here
    alert('oh my god');
    aa = 1;  
}  
alert("aa" in window); // yes, the property exists, it's true
alert(aa); // aa is still undefined
于 2013-05-30T08:57:10.673 に答える
2

アラートを順番に見てみましょう:

  • ブール条件が false である("aa" in window) === trueため、アラート #1には到達しません。if

JavaScript には関数スコープがあり、変数aaは最初にスコープの先頭まで「巻き上げられる」ため、定義されます

  • アラート #2

"aa" in window巻き上げられたときに変数が window オブジェクトに追加されたため、 true です。単に書くのと同じです:

var foo;
"foo" in window (which === true)
  • アラート #3

標準 ECMA-262 ECMAScript 言語仕様から:

変数ステートメントは、10.5 で定義されているように作成された変数を宣言します。変数は、作成時に未定義に初期化されます。Initializer を持つ変数には、変数の作成時ではなく、VariableStatement の実行時にそのAssignmentExpressionの値が割り当てられます。

aa割り当てが実行されなかったため、未定義です。

于 2013-05-30T10:39:51.153 に答える