js中加「var」和不加「var」的區別,看完以爲這麼多年js白學了

http://www.javashuo.com/article/p-mpcavewn-cq.htmlhtml

 

 

Javascript聲明變量的時候,雖然用var關鍵字聲明和不用關鍵字聲明,不少時候運行並無問題,可是這兩種方式仍是有區別的。能夠正常運行的代碼並不表明是合適的代碼。

var num = 1;瀏覽器

是在當前域中聲明變量. 若是在方法中聲明,則爲局部變量(local variable);若是是在全局域中聲明,則爲全局變量。閉包

而 num = 1;函數

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

注意!它並非聲明瞭一個全局變量,而是建立了一個全局對象的屬性。htm

即使如此,可能你仍是很難明白「變量聲明」跟「建立對象屬性」在這裏的區別。事實上,Javascript的變量聲明、建立屬性以及每一個Javascript中的每一個屬性都有必定的標誌說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。對象

因爲變量聲明自帶不可刪除屬性,比較var num = 1 跟 num = 1,前者是變量聲明,帶不可刪除屬性,所以沒法被刪除;後者爲全局變量的一個屬性,所以能夠從全局變量中刪除。blog

具體見如下代碼:繼承

 

複製代碼代碼以下:

// num1爲全局變量,num2爲window的一個屬性

 

                     var num1 = 1;ip

                     num2 = 2;

                     // delete num1;  沒法刪除

                     // delete num2;  刪除

                     function model(){

                            var num1 = 1; // 本地變量

                            num2 = 2;     // window的屬性

                            // 匿名函數

                            (function(){

                                   var num = 1; // 本地變量

                                   num1 = 2; // 繼承做用域(閉包)

                                   num3 = 3; // window的屬性

                            }())

                     }

 

PS. 在ECMAScript5標準中,有一種「嚴格模式」(Strict Mode)。在嚴格模式中,爲未聲明的標識符賦值將會拋引用錯誤,所以能夠防止意外的全局變量屬性的創造。目前一些瀏覽器的新版本已經支持。

相關文章
相關標籤/搜索