説明できない JavaScript 変数の動作に出くわしました。
var で宣言された変数のスコープは、囲んでいる関数、または関数の外側で宣言された変数の場合、グローバル スコープ (グローバル オブジェクトにバインドされている) です。
また、グローバル変数がグローバル オブジェクトのプロパティになることも知られています。ブラウザ環境では「window」、node.js では「global」です。これは、変数が関数内で「var」キーワードを使用して宣言されている場合、それはローカルになり、実行されることを意味します。グローバル オブジェクトには入りません。
この例はそれを証明しています:
(function(){
var t = 1;
console.log(t in window, t); // outputs: false 1
}());
ここまでは順調ですね。ただし、変数が初期化されていない場合、関数スコープ内にあるにもかかわらず、ウィンドウ オブジェクトのプロパティになります。
(function(){
var t;
console.log(t in window, t); // outputs: true undefined
}());
なぜそれが起こるのですか?この動作の詳細はどこで確認できますか? 通常のチュートリアルではこれをカバーしていないようです。
前もって感謝します。
[編集]: Pointy のおかげで、スコープが期待どおりに機能することが明確になりました。「in」演算子の動作についての理解が間違っていました。「in」ドキュメントによると、左側のオペランドを数値または文字列に強制し、右側のオブジェクトでそのようなインデックスまたはプロパティ名を探します。したがって、例1では、次のようになりました
'1' in window
これは間違っていました
例2では
'undefined' in window
これは本当でした。