JavaScript中用var和不用var的區別

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

  varnum=1;程序員

  是在當前域中聲明變量。若是在方法中聲明,則爲局部變量(localvariable),若是是在全局域中聲明,則爲全局變量。web

  而瀏覽器

  num=1;閉包

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

我本身是一名從事了多年開發的web前端老程序員,目前辭職在作本身的web前端私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習乾貨,各類框架都有整理,送給每一位前端小夥伴,想要獲取的能夠關注個人頭條號並在後臺私信我:前端,便可免費獲取。函數

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

 

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

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

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

  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)。在嚴格模式中,爲未聲明的標識符賦值將會拋引用錯誤,所以能夠防止意外的全局變量屬性的創造。目前一些瀏覽器的新版本已經支持。

 

JavaScript中用var和不用var的區別
相關文章
相關標籤/搜索