5

説明できない JavaScript 変数の動作に出くわしました。

var keyword に関するJSドキュメントによると:

var で宣言された変数のスコープは、囲んでいる関数、または関数の外側で宣言された変数の場合、グローバル スコープ (グローバル オブジェクトにバインドされている) です。

また、グローバル変数がグローバル オブジェクトのプロパティになることも知られています。ブラウザ環境では「window」、node.js では「global」です。これは、変数が関数内で「var」キーワードを使用して宣言されている場合、それはローカルになり、実行されることを意味します。グローバル オブジェクトには入りません。

この例はそれを証明しています:

(function(){
    var t = 1;
    console.log(t in window, t); // outputs: false 1
}());

jsfiddle リンク

ここまでは順調ですね。ただし、変数が初期化されていない場合、関数スコープ内にあるにもかかわらず、ウィンドウ オブジェクトのプロパティになります。

(function(){
    var t;
    console.log(t in window, t); // outputs: true undefined
}());

jsfiddle リンク

なぜそれが起こるのですか?この動作の詳細はどこで確認できますか? 通常のチュートリアルではこれをカバーしていないようです。

前もって感謝します。

[編集]: Pointy のおかげで、スコープが期待どおりに機能することが明確になりました。「in」演算子の動作についての理解が間違っていました。「in」ドキュメントによると、左側のオペランドを数値または文字列に強制し、右側のオブジェクトでそのようなインデックスまたはプロパティ名を探します。したがって、例1では、次のようになりました

'1' in window

これは間違っていました

例2では

'undefined' in window

これは本当でした。

4

2 に答える 2

4

問題は、テスト コードでin演算子が誤って使用されていることです。実際にテストしているのは、「undefined」という名前がwindow「t」ではなく で定義されているかどうかです。なんで?の左側のオペランドがin文字列に強制されるためです。"t" はundefinedであるため、文字列 "undefined" に強制され、実際にそのプロパティ名はグローバル コンテキストに存在します。

テストを次のように変更します

console.log("t" in window, t);
于 2013-05-02T14:19:36.110 に答える