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

首頁 > 語言 > JavaScript > 正文

深入理解javascript變量聲明

2024-05-06 16:10:46
字體:
來源:轉載
供稿:網友
本文是談談自己對于javascript中變量聲明的一些看法、感想和理解,算是自己的一個小總結吧,分享出來給大家,希望對小伙伴們能有所幫助
 
 

相對于C/C++來說,ECMAScript里的for循環并不能創建一個局部的上下文。

 

復制代碼代碼如下:

for (var k in {a: 1, b: 2}) {
  alert(k);

 

alert(k); // 盡管循環已經結束但變量k依然在當前作用域 
任何時候,變量只能通過使用var關鍵字才能聲明。
 
上面的賦值語句:
 
a = 10; 
這僅僅是給全局對象創建了一個新屬性(但它不是變量)。“不是變量”并不是說它不能被改變,而是指它不符合ECMAScript規范中的變量概念,所以它“不是變量”(它之所以能成為全局對象的屬性,完全是因為javascript中存在一個global對象,這樣的操作不是聲明一個變量而是給global對象增加一個a屬性。
 
下面看一個簡單的例題來說明問題

 

復制代碼代碼如下:

if (!("a" in window)) {
    var a = 1;
}
alert(a); 

 

首先,所有的全局變量都是window的屬性,語句 var a = 1;等價于window.a = 1;
 
你可以用如下方式來檢測全局變量是否聲明
 
"變量名稱" in window 

第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子:
 

復制代碼代碼如下:

alert("a" in window);
var a; 

 

此時,盡管聲明是在alert之后,alert彈出的依然是true,這是因為JavaScript引擎首先會掃墓所有的變量聲明,然后將這些變量聲明移動到頂部,最終的代碼效果是這樣的:

 

復制代碼代碼如下:

var a;
alert("a" in window); 

 

第三,你需要理解該題目的意思是,變量聲明被提前了,但變量賦值沒有,因為這行代碼包括了變量聲明和變量賦值。

你可以將語句拆分為如下代碼:

 

復制代碼代碼如下:

var a;    //聲明
a = 1;    //初始化賦值 

 

所以總結起來就是當變量聲明和賦值在一起用的時候,JavaScript引擎會自動將它分為兩部以便將變量聲明提前,不將賦值的步驟提前是因為他有可能影響代碼執行出不可預期的結果。

題目中的代碼相當于:

 

復制代碼代碼如下:

var a;
if (!("a" in window)) {
    a = 1;
}
alert(a); 

 

根據上述例題的分析,聲明變量時如果是聲明的局部變量前面一定要加var,如果聲明的是全局變量可以不加var(最好限制全局變量的個數,盡量使用局部變量)

下面講述一個使用var的幾個特性

使用var語句多次聲明一個變量不僅是合法的,而且也不會造成任何錯誤。
如果重復使用的一個聲明有一個初始值,那么它擔當的不過是一個賦值語句的角色。
如果重復使用的一個聲明沒有一個初始值,那么它不會對原來存在的變量有任何的影響。 
沒有var聲明的變量,是作為全局變量存在的;有var聲明的變量,屬于局部變量,尤其是在函數內部。并且,經過測試,帶var聲明比不帶var速度要快。函數內盡量多設局部變量,這樣即安全又快速,變量操作也更加合理,不會因為函數內胡亂操作全局變量而導致邏輯錯誤。

聲明對象時最好使用對象自面量的方式,這樣的速度相對new的方式要快很多。

變量名是自己取的,為了照顧語義和規范,變量名可能稍長,但是注意了,變量名的長度也會影響代碼的執行速度。長的變量名聲明的執行速度沒有短的快。


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

圖片精選

主站蜘蛛池模板: 民县| 紫金县| 旬邑县| 藁城市| 信阳市| 安达市| 无为县| 阳春市| 江源县| 镇远县| 乐安县| 吕梁市| 西藏| 河津市| 射洪县| 长沙县| 开化县| 长汀县| 武汉市| 永丰县| 阳城县| 沁水县| 上杭县| 蒙自县| 清水县| 福建省| 肥城市| 绿春县| 惠水县| 高雄县| 顺昌县| 嘉义市| 措勤县| 潞西市| 英山县| 兰坪| 临桂县| 维西| 上虞市| 忻州市| 达拉特旗|