下面這段程式碼執行後是 undefined
<script type="text/javascript">
if (! 'a' in window) {
var a = 123;
}
console.log(a);
</script>
說明 'a' in window
為 true
, 可是 a 在什麼時候宣告的呢?請教大家,謝謝!
我又把程式碼改成:
<script type="text/javascript">
if (! 'a' in window) {
a = 123;
}
console.log(a);
</script>
結果a is not defined
。既然 a
已經聲明,為什麼要報這個錯誤呢?
黄舟2017-06-12 09:34:55
先說變數提升吧
if (! 'a' in window) {
var a = 123;
}
console.log(a);
這段程式碼無論是否進入 if
的程式碼區塊內,a 都是存在的
因為在 JavaScript 執行時,所有透過 var
定義的變數以及宣告式函數都會被提升到目前作用域的頂端
而透過 var
建立的變數是沒有塊級作用域的,所以會提升到目前函數作用域的頂端
在全域作用域定義的變數都是 window 的屬性
所以這段程式碼實際上執行的時候是這樣的順序
var a;
if (! 'a' in window) {
a = 123;
}
console.log(a); // undefined
定義了 a
,但沒有賦值,自然輸出了 undefined
關於其中! 'a' in window
其實是先對'a'
字串執行非,得到了false
,window
裡沒有false
,window
裡沒有
,沒有進入if 程式碼區塊。
具體可試試以下範例
false in window; // false
window.false = 123;
false in window; // true
!false in window; // false
true in window; // false
window.true = 456;
!false in window; // true
'true' in window; // true
第二個問題
看懂了上面這個就很簡單了,沒用 if (! 'a' in window) {
a = 123;
}
console.log(a); // Uncaught ReferenceError: a is not defined
var
定義(不存在提升),又沒進
大家讲道理2017-06-12 09:34:55
這段執行沒毛病啊,! 'a' in window
這個是false,然後a的賦值沒執行,再console不就是undefined麼。
如果想讓賦值執行,判斷條件改成!('a' in window)
就行了。
如果還沒明白,請查一下運算子優先列表。
代言2017-06-12 09:34:55
var
宣告的時候會發生變數提升,在編輯階段就把程式碼宣告放在函數或程式碼開頭,所以就變成這個樣子:
<script type="text/javascript">
var a;
if (! ('a' in window)) {
a = 123;
}
console.log(a);
</script>
所以a in window
是true
。
至於
<script type="text/javascript">
if (! ('a' in window)) {
a = 123;
}
console.log(a);
</script>
程式碼不包含var a
。所以不存在變數提升的問題,所以a就沒有宣告過,所以!('a' in window)是true,所以a
是123
https://developer.mozilla.org...
阿神2017-06-12 09:34:55
你第一段就理解錯了'a' in window
你第一段就理解錯了'a' in window
你第一段就理解錯了'a' in window
為false