1. 程式人生 > >ES6簡介之let和const命令解說

ES6簡介之let和const命令解說

  一、var申明變數

  學習過JavaScript的同學都應該知道,ES5中申明變數使用var,ES5中的var可以說是無所不能的,所有型別的變數都是由var來申明,但往往很多使用者不知道var申明的變數存在變數提升,即變數可以在申明之前使用,有時不注意申明的作用域會導致全域性變數汙染,特別要注意這種隱形的全域性變數申明,直接沒有val,比如a = 3,像這個變數a就成了全域性變數,如果此時你在用var申明一個a變數,在使用過程中隱形變數a 的值就會被覆蓋,這就是容易導致全域性變數汙染的原因之一,還以一個大家可能會產生誤解的地方就是,所謂全域性變數就是在javaScript程式碼中function最前邊的var申明是全域性變數,後面的就不是,其實var申明的變數只要不在function中就全部是全域性變數,這點一定要注意。特別要說明的一點就是var申明的變數存在變數提升,我們先來看下面一段簡單的程式碼

  
1 console.log(a);
2 var a = 4;
3 會輸出underfined,不會報錯referenceError
var申明變數提升舉例說明

  二、let申明變數

  今天要給大家解說的let申明變數使用跟var申明一樣滴,只不過let申明的變數是隻在程式碼塊中有效,即{}中有效,看下面程式碼

  
1 {
2   let a = 10;
3   var b = 3;    
4 }
5 console.log(a)
6 //ReferenceError:a is not defined
7 console.log(b)
8 // 3
let 變數申明

  從這段程式碼的執行結果可以明顯的看出,let申明的變量出了程式碼塊就無法訪問,這樣就一定程度上避免了全域性變數汙染,而且let申明的變數不存在變數提升的現象,也就是說使用let申明變數只能先宣告在使用,否則就會報錯,現在說的塊級作用域可以稱作為暫時性死區(TDZ),在這個暫時性死區中申明的變數外邊無法訪問。還有一點就是一個變數不允許let和var重複申明。在這裡順道給大家說一下塊級作用域,ES5中只有全域性作用域和函式作用域,沒有塊級作用域這導致很多場景不合理:

  第一種場景:內層變數可能會覆蓋外層變數;

  第二種場景:用來計數的迴圈變數洩露為全域性變數;

let實際上就是為JavaScript新增了塊級作用域,而且塊級作用域可以巢狀。有興趣的同學可以去看一看ES6中的do表示式,獲取程式碼塊的返回值。

  三、const申明變數

      const申明一個只讀的常量,一旦申明,常量的值就不能改變,也就是說const一旦申明常量,就必須立即初始化,不能留到以後賦值,否則就會報錯。

 

 

  關於ES6中let和const命令申明變數就說這麼,如有錯誤之處,歡迎大家評論區指正討論,感謝!