javascript - 關於變數名稱提升的問題?
巴扎黑
巴扎黑 2017-06-12 09:32:55
0
5
644

下面這段程式碼執行後是 undefined

#
<script type="text/javascript">
if (! 'a' in window) {
  var a = 123;
}
console.log(a);
</script>

說明 'a' in windowtrue, 可是 a 在什麼時候宣告的呢?請教大家,謝謝!

我又把程式碼改成:

<script type="text/javascript">
if (! 'a' in window) {
  a = 123;
}
console.log(a);
</script>

結果a is not defined。既然 a 已經聲明,為什麼要報這個錯誤呢?

巴扎黑
巴扎黑

全部回覆(5)
黄舟

先說變數提升吧

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' 字串執行,得到了falsewindow 裡沒有falsewindow 裡沒有

.

,沒有進入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 定義(不存在提升),又沒進

if🎜,導致沒有定義 a,報錯。 🎜
大家讲道理

這段執行沒毛病啊,! 'a' in window這個是false,然後a的賦值沒執行,再console不就是undefined麼。
如果想讓賦值執行,判斷條件改成!('a' in window)就行了。

如果還沒明白,請查一下運算子優先列表。

代言

var宣告的時候會發生變數提升,在編輯階段就把程式碼宣告放在函數或程式碼開頭,所以就變成這個樣子:

<script type="text/javascript">
var a;
if (! ('a' in window)) {
  a = 123;
}
console.log(a);
</script>

所以a in windowtrue

至於

<script type="text/javascript">
if (! ('a' in window)) {
  a = 123;
}
console.log(a);
</script>

程式碼不包含var a。所以不存在變數提升的問題,所以a就沒有宣告過,所以!('a' in window)是true,所以a123

https://developer.mozilla.org...

阿神

你第一段就理解錯了
'a' in window 你第一段就理解錯了
'a' in window 你第一段就理解錯了
'a' in window 為false

!'a' in window🎜 才為true🎜才會執行🎜var a = 123; 才為true🎜才有被賦值的存在🎜
学习ing

熊貓桑正解啊=_=

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板