深入理解javascript變量聲明
相對(duì)于C/C++來(lái)說(shuō),ECMAScript里的for循環(huán)并不能創(chuàng)建一個(gè)局部的上下文。
for (var k in {a: 1, b: 2}) {
alert(k);
}
alert(k); // 盡管循環(huán)已經(jīng)結(jié)束但變量k依然在當(dāng)前作用域
任何時(shí)候,變量只能通過(guò)使用var關(guān)鍵字才能聲明。
上面的賦值語(yǔ)句:
a = 10;
這僅僅是給全局對(duì)象創(chuàng)建了一個(gè)新屬性(但它不是變量)?!安皇亲兞俊辈⒉皇钦f(shuō)它不能被改變,而是指它不符合ECMAScript規(guī)范中的變量概念,所以它“不是變量”(它之所以能成為全局對(duì)象的屬性,完全是因?yàn)閖avascript中存在一個(gè)global對(duì)象,這樣的操作不是聲明一個(gè)變量而是給global對(duì)象增加一個(gè)a屬性。
下面看一個(gè)簡(jiǎn)單的例題來(lái)說(shuō)明問(wèn)題
if (!("a" in window)) {
var a = 1;
}
alert(a);
首先,所有的全局變量都是window的屬性,語(yǔ)句 var a = 1;等價(jià)于window.a = 1;
你可以用如下方式來(lái)檢測(cè)全局變量是否聲明
"變量名稱" in window
第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子:
alert("a" in window);
var a;
此時(shí),盡管聲明是在alert之后,alert彈出的依然是true,這是因?yàn)镴avaScript引擎首先會(huì)掃墓所有的變量聲明,然后將這些變量聲明移動(dòng)到頂部,最終的代碼效果是這樣的:
var a;
alert("a" in window);
第三,你需要理解該題目的意思是,變量聲明被提前了,但變量賦值沒(méi)有,因?yàn)檫@行代碼包括了變量聲明和變量賦值。
你可以將語(yǔ)句拆分為如下代碼:
var a; //聲明
a = 1; //初始化賦值
所以總結(jié)起來(lái)就是當(dāng)變量聲明和賦值在一起用的時(shí)候,JavaScript引擎會(huì)自動(dòng)將它分為兩部以便將變量聲明提前,不將賦值的步驟提前是因?yàn)樗锌赡苡绊懘a執(zhí)行出不可預(yù)期的結(jié)果。
題目中的代碼相當(dāng)于:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
根據(jù)上述例題的分析,聲明變量時(shí)如果是聲明的局部變量前面一定要加var,如果聲明的是全局變量可以不加var(最好限制全局變量的個(gè)數(shù),盡量使用局部變量)
下面講述一個(gè)使用var的幾個(gè)特性
使用var語(yǔ)句多次聲明一個(gè)變量不僅是合法的,而且也不會(huì)造成任何錯(cuò)誤。
如果重復(fù)使用的一個(gè)聲明有一個(gè)初始值,那么它擔(dān)當(dāng)?shù)牟贿^(guò)是一個(gè)賦值語(yǔ)句的角色。
如果重復(fù)使用的一個(gè)聲明沒(méi)有一個(gè)初始值,那么它不會(huì)對(duì)原來(lái)存在的變量有任何的影響。
沒(méi)有var聲明的變量,是作為全局變量存在的;有var聲明的變量,屬于局部變量,尤其是在函數(shù)內(nèi)部。并且,經(jīng)過(guò)測(cè)試,帶var聲明比不帶var速度要快。函數(shù)內(nèi)盡量多設(shè)局部變量,這樣即安全又快速,變量操作也更加合理,不會(huì)因?yàn)楹瘮?shù)內(nèi)胡亂操作全局變量而導(dǎo)致邏輯錯(cuò)誤。
聲明對(duì)象時(shí)最好使用對(duì)象自面量的方式,這樣的速度相對(duì)new的方式要快很多。
變量名是自己取的,為了照顧語(yǔ)義和規(guī)范,變量名可能稍長(zhǎng),但是注意了,變量名的長(zhǎng)度也會(huì)影響代碼的執(zhí)行速度。長(zhǎng)的變量名聲明的執(zhí)行速度沒(méi)有短的快。
相關(guān)文章
javascript學(xué)習(xí)(二)javascript常見問(wèn)題總結(jié)
在js使用過(guò)程中,經(jīng)常會(huì)碰到一些問(wèn)題,本人利用閑暇時(shí)間整理了一些常見問(wèn)題的解決方法,貼出來(lái)和大家分享,有需要的朋友可以參考下2013-01-01
JavaScript中Number.MIN_VALUE屬性的使用示例
這篇文章主要介紹了JavaScript中Number.MIN_VALUE屬性的使用示例,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06
簡(jiǎn)述JavaScript對(duì)傳統(tǒng)文檔對(duì)象模型的支持
這篇文章主要介紹了簡(jiǎn)述JavaScript對(duì)傳統(tǒng)文檔對(duì)象模型的支持,是JS學(xué)習(xí)進(jìn)階中的重要知識(shí),需要的朋友可以參考下2015-06-06
深入解析JavaScript中的數(shù)字對(duì)象與字符串對(duì)象
這篇文章主要介紹了JavaScript中的數(shù)字對(duì)象與字符串對(duì)象,是JavaScript入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
JavaScript中的lastIndexOf()方法使用詳解
這篇文章主要介紹了JavaScript中的lastIndexOf()方法使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06
寫給想學(xué)習(xí)Javascript的朋友一點(diǎn)學(xué)習(xí)經(jīng)驗(yàn)小結(jié)
今天逛論壇時(shí)看到有朋友問(wèn),是否有專門教Javascript的學(xué)校,這里想想把自己的一點(diǎn)建議和自己3年來(lái)的前端Javascript開發(fā)的經(jīng)驗(yàn)跟大家分享下,也給出幾本個(gè)人認(rèn)為不錯(cuò)的書來(lái)做為大家學(xué)習(xí)的參考資料。2010-11-11

