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),在嚴格模式中,為未宣告的識別符號賦值將會拋參考錯誤,因此可以防止意外的全域變數屬性的創造,目前一些瀏覽器的新版本已經支持,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/160098.html
標籤:JavaScript
上一篇:學習Web前端開發時有哪些技術點
下一篇:JS---案例:滾動條
