javascript定義變數和優先順序的問題

來源:互聯網
上載者:User

這篇文章可以和上一篇函數優先順序的文章結合起來看。

看下面的代碼:

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

回答以下問題:

  1. 會報錯嗎?會彈出幾次?
  2. 第2個alert是true還是false?
  3. 第3個alert彈出什嗎?
  4. 為什嗎?

思考下,然後測試下,如果你回答正確,那麼後面的文章就不用看了。

-----------------------------

在JS裡定義變數太簡單了,直接一個var ,甚至不用var都可以:

var a = 1;

這裡a就是變數名,1就是變數值。唉,這個太基礎了。看下面的代碼:

var a;
alert(a);

以firebug測試,會彈出undefined,這個是大家很熟悉的一個字串了,貌似表示變數未定義。但我覺得,我已經var了啊,這就是定義了嘛,只是沒有附值而已。

我們來個真正的沒有定義的:

alert(a);

沒錯,就是直接alert一個根本沒有出現過的變數,這會如何?

firebug直接報錯了:a is not defined.意思是a沒有定義。這個結合前面的代碼來看,讓人困惑。這個沒有定義和前面的未定義有什麼不同呢?

其實前面的代碼等價於這樣的:

var a = undefined;
alert(a);

也就是說,當聲明變數而不賦值時,JS會給變數傳一個undefined值,注意,這是個“值”,說明a已經有值了,只是這個值就叫“未定義”。

而後面的直接alert,變數從沒有出現過,也就是說這才是真正的未定義。

簡單的說:JS中不存在沒有值的變數,變數聲明的時候就賦值了。

然後我們看下面的代碼:

alert(a);
var a = 1;

這個代碼會報錯嗎?因為在alert的時候變數a還沒來得及出現呀。

但是這樣居然沒有報錯,而是彈出了undefined值。表明變數a已經存在了,只是值卻不是我們想要的,而是undefined。這又是個什麼問題呢?

因為var 變數聲明和函式宣告一樣,會提前,其實上面的代碼是這樣的:

var a;
alert(a);
a = 1;

這麼一來就懂了。

所以,這個問題的關鍵在於:var 聲明會提前到範圍頂端,但附值卻不會———好糾結的設定,不知道為什麼要這麼搞。個人覺得這是JS的一個缺陷。

現在有一種代碼習慣,主張把變數聲明一律放在範圍前方,大概就是考慮到這個——反正就算你不寫在前方,JS也會提前到前方。

現在放出文首問題的答案

只會彈出兩個alert,而if裡面的alert不會執行,因為var聲明的提前性,導致真正的代碼是這個樣子:

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

雖然aa為空白,但用’aa’ in window判斷時會為真,因為aa確實存在了,值是undefined。所以if代碼不會執行。後面兩個alert我就不說了。

個人感覺這是一個很無厘頭的問題,我們應該瞭解他的原因,但鄙視他這種陷阱。

上面這個問題也是我寫這篇文章的緣由,這段代碼是我從一篇網文裡看到的,但他裡面沒有答案,我百撕不得騎姐,跑到stackoverflow上去問了才搞清楚。答案就是這篇文章。

但這是很基礎的問題啊其實!!!

哈哈,原諒我,後面還有一個問題:

var b = {}
alert(b.aa);
alert(b.aa.bb);

這也是一種聲明變數的方式,那麼,這段代碼會報錯嗎?為什嗎?

本文連結: javascript定義變數和優先順序的問題.轉載請保留.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.