Javascript聲明變數的,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運行的代碼並不代表是合適的代碼。 varnum=1; 是在當前域中聲明變數。如果在方法中聲明,則為局部變數(localvariable),如果是在全局域中聲明,則為全局 ...
Javascript聲明變數的,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運行的代碼並不代表是合適的代碼。
varnum=1;
是在當前域中聲明變數。如果在方法中聲明,則為局部變數(localvariable),如果是在全局域中聲明,則為全局變數。
而
num=1;
事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域etc。。。)中解析num,如果在任何當前作用域鏈中找到num,則會執行對num屬性賦值,如果沒有找到num,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造num屬性並賦值。
我自己是一名從事了多年開發的web前端老程式員,目前辭職在做自己的web前端私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習乾貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關註我的頭條號併在後臺私信我:前端,即可免費獲取。
註意!它並不是聲明瞭一個全局變數,而是創建了一個全局對象的屬性。
即便如此,可能你還是很難明白"變數聲明"跟"創建對象屬性"在這裡的區別。事實上,Javascript的變數聲明、創建屬性以及每個Javascript中的每個屬性都有一定的標誌說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。
由於變數聲明自帶不可刪除屬性,比較varnum=1跟num=1,前者是變數聲明,帶不可刪除屬性,因此無法被刪除;後者為全局變數的一個屬性,因此可以從全局變數中刪除。
Javascript聲明變數的時候,雖然用var關鍵字聲明和不用關鍵字聲明,很多時候運行並沒有問題,但是這兩種方式還是有區別的。可以正常運行的代碼並不代表是合適的代碼。
varnum=1;
是在當前域中聲明變數。如果在方法中聲明,則為局部變數(localvariable),如果是在全局域中聲明,則為全局變數。
而
num=1;
事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域etc。。。)中解析num,如果在任何當前作用域鏈中找到num,則會執行對num屬性賦值,如果沒有找到num,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造num屬性並賦值。
註意!它並不是聲明瞭一個全局變數,而是創建了一個全局對象的屬性。
即便如此,可能你還是很難明白"變數聲明"跟"創建對象屬性"在這裡的區別。事實上,Javascript的變數聲明、創建屬性以及每個Javascript中的每個屬性都有一定的標誌說明它們的屬性----如只讀(ReadOnly)不可枚舉(DontEnum)不可刪除(DontDelete)等等。
由於變數聲明自帶不可刪除屬性,比較varnum=1跟num=1,前者是變數聲明,帶不可刪除屬性,因此無法被刪除;後者為全局變數的一個屬性,因此可以從全局變數中刪除。
//num1為全局變數,num2為window的一個屬性
varnum1=1;
num2=2;
//deletenum1;無法刪除
//deletenum2;刪除
functionmodel(){
varnum1=1;//本地變數
num2=2;//window的屬性
//匿名函數
(function(){
varnum=1;//本地變數
num1=2;//繼承作用域(閉包)
num3=3;//window的屬性
}())
}
最後:在ECMAScript5標準中,有一種"嚴格模式"(StrictMode)。在嚴格模式中,為未聲明的標識符賦值將會拋引用錯誤,因此可以防止意外的全局變數屬性的創造。目前一些瀏覽器的新版本已經支持。