最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 21:27:54
文檔

JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧

JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧:看下面的代碼: 代碼如下: if (!(aa in window)) { alert('oh my god'); var aa = 1; } alert(aa in window); alert(aa); 回答以下問題: 會報錯嗎?會彈出幾次? 第2個alert是true還是false? 第3個alert彈出什么?
推薦度:
導(dǎo)讀JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧:看下面的代碼: 代碼如下: if (!(aa in window)) { alert('oh my god'); var aa = 1; } alert(aa in window); alert(aa); 回答以下問題: 會報錯嗎?會彈出幾次? 第2個alert是true還是false? 第3個alert彈出什么?

看下面的代碼:

代碼如下:
if (!("aa" in window)) {
alert('oh my god');
var aa = 1;
}
alert("aa" in window);
alert(aa);

回答以下問題:

會報錯嗎?會彈出幾次?
第2個alert是true還是false?
第3個alert彈出什么?
為什么?
思考下,然后測試下,如果你回答正確,那么后面的文章就不用看了。

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

在JS里定義變量太簡單了,直接一個var ,甚至不用var都可以:
代碼如下:
var a = 1;

這里a就是變量名,1就是變量值。唉,這個太基礎(chǔ)了??聪旅娴拇a:
代碼如下:
var a;
alert(a);

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

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

代碼如下:
alert(a);

沒錯,就是直接alert一個根本沒有出現(xiàn)過的變量,這會如何?

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

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

代碼如下:
var a = undefined;
alert(a);

也就是說,當(dāng)聲明變量而不賦值時,JS會給變量傳一個undefined值,注意,這是個“值”,說明a已經(jīng)有值了,這個值就叫“未定義”。

而后面的直接alert,變量從沒有出現(xiàn)過,也就是說這才是真正的未定義。

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

然后我們看下面的代碼:

代碼如下:
alert(a);
var a = 1;

這個代碼會報錯嗎?因為在alert的時候變量a還沒來得及出現(xiàn)呀。

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

因為var 變量聲明和函數(shù)聲明一樣,會提前,其實上面的代碼是這樣的:

代碼如下:
var a;
alert(a);
a = 1;

這么一來就懂了。

所以,這個問題的關(guān)鍵在于:var 聲明會提前到作用域頂端,但附值卻不會———好糾結(jié)的設(shè)定,不知道為什么要這么搞。個人覺得這是JS的一個缺陷。

現(xiàn)在有一種代碼習(xí)慣,主張把變量聲明一律放在作用域前方,大概就是考慮到這個——反正就算你不寫在前方,JS也會提前到前方。

現(xiàn)在放出文首問題的答案:

只會彈出兩個alert,而if里面的alert不會執(zhí)行,因為var聲明的提前性,導(dǎo)致真正的代碼是這個樣子:

代碼如下:
var aa;
if (!("aa" in window)) {
alert('oh my god');
aa = 1;
}
alert("aa" in window);
alert(aa);

雖然aa為空,但用'aa' in window判斷時會為真,因為a確實存在了,而值是undefined。所以if代碼不會執(zhí)行。后面兩個alert我就不說了。

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

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

但這是很基礎(chǔ)的問題啊其實?。?!

哈哈,原諒我,后面還有一個問題:
代碼如下:
var b = {}
alert(b.aa);
alert(b.aa.bb);

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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧

JavaScript定義變量和變量優(yōu)先級問題探討_javascript技巧:看下面的代碼: 代碼如下: if (!(aa in window)) { alert('oh my god'); var aa = 1; } alert(aa in window); alert(aa); 回答以下問題: 會報錯嗎?會彈出幾次? 第2個alert是true還是false? 第3個alert彈出什么?
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top