首頁 >web前端 >js教程 >在Javascript中 聲明時用'var'與不用'var'的區別_基礎知識

在Javascript中 聲明時用'var'與不用'var'的區別_基礎知識

WBOY
WBOY原創
2016-05-16 17:37:041109瀏覽

Javascript聲明變數的時候,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運作的程式碼並不代表是合適的程式碼。

var num = 1;

是在目前域中宣告變數. 如果在方法中聲明,則為局部變數(local variable);如果是在全域域中聲明,則為全域變數。

而 num = 1;

事實上是對屬性賦值運算。首先,它會嘗試在目前作用域鏈(如在方法中聲明,則目前作用域鏈代表全域作用域和方法局部作用域etc。。)中解析num; 如果在任何目前作用域鏈中找到num ,則會執行對num屬性賦值; 如果沒有找到num,它才會在全域物件(即當前作用域鏈的最頂層對象,如window對象)中創造num屬性並賦值。

注意!它並不是聲明了一個全域變量,而是創建了一個全域物件的屬性。

即便如此,可能你還是很難明白「變數宣告」跟「建立物件屬性」在這裡的差異。事實上,Javascript的變數宣告、建立屬性以及每個Javascript中的每個屬性都有一定的標誌說明它們的屬性----如唯讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。

由於變數宣告自帶不可刪除屬性,比較var num = 1 跟num = 1,前者是變數聲明,帶不可刪除屬性,因此無法被刪除;後者為全域變數的一個屬性,因此可以從全域變數中刪除。

具體見以下程式碼:

複製程式碼 程式碼如下:

// num1為全域變量,num2為全域變量屬性

                     的 num1 = 1;

                     num2 = 2;

                     // delete num1;  無法移除

                     // delete num2;  刪除

                     以 model(){

                            var num1 = 1; //局部變項

                            num2 = 2;     // window的屬性

                            // 匿名函數

                            (function(){

                               

                                  

                                  

                            }())

                     }


PS. 在ECMAScript5標準中,有一個「嚴格模式」(Strict Mode)。在嚴格模式中,為未宣告的識別符賦值將會拋引用錯誤,因此可以防止意外的全域變數屬性的創造。目前一些瀏覽器的新版本已經支援。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn