国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript定義變量和變量優先級問題探討

2024-05-06 16:09:32
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript定義變量和變量優先級的問題探討,變量的定義還有這么講究嗎,不錯,看完本文相信你會有一定的收獲,需要的朋友可以參考下
 
 

看下面的代碼:

 

復制代碼代碼如下:

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就是變量值。唉,這個太基礎了。看下面的代碼:
復制代碼代碼如下:

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判斷時會為真,因為a確實存在了,而值是undefined。所以if代碼不會執行。后面兩個alert我就不說了。

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

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

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

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

復制代碼代碼如下:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 浙江省| 沙湾县| 肥东县| 清苑县| 济南市| 安西县| 南通市| 建瓯市| 永丰县| 游戏| 福贡县| 昔阳县| 环江| 双桥区| 望江县| 南阳市| 承德市| 广河县| 嘉兴市| 张北县| 隆回县| 扎囊县| 西乌珠穆沁旗| 塔河县| 云南省| 赞皇县| 秦皇岛市| 庆云县| 山东省| 萝北县| 新巴尔虎左旗| 黄大仙区| 买车| 双峰县| 定襄县| 枞阳县| 云梦县| 丁青县| 延安市| 青铜峡市| 城步|