首頁 > web前端 > js教程 > 主體

深入理解javascript變數宣告_基礎知識

WBOY
發布: 2016-05-16 16:30:50
原創
1445 人瀏覽過

相對於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的方式要快很多。

變數名是自己取的,為了照顧語意和規範,變數名可能稍長,但是注意了,變數名的長度也會影響程式碼的執行速度。長的變數名宣告的執行速度沒有短的快。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!