【系統學習ES6】第一節:新的聲明方式


【系統學習ES6】

 

本專題旨在對ES6的常用技術點進行系統性梳理,幫助大家對其有更好的掌握。計划每周更新1-2篇,希望大家有所收獲。

以前用ES5時,聲明變量只能用varES6的出現,為我們帶來了兩種新的聲明方式:letconst。我們可以先簡單記憶:

  • var:聲明全局變量

  • let:聲明局部變量

  • const:聲明常量

var聲明

varES6里是用來聲明全局變量的,我們先看一個簡單的例子:

var a = "lemoncool";
console.log(a);

控制台輸出了“lemoncool”。但這個例子不足以聲明a是全局變量。我們繼續聲明一個函數,在函數體中看是否可以拿到函數外面聲明的a

var a = "lemoncool";
var testFun = function(){
 console.log(a);

testFun();

控制台同樣輸出了“lemoncool”,說明函數中可以拿到外部聲明的a,這可以說明var聲明的變量確實是全局的。如果你覺得這個例子說服力還不夠,那我們繼續看。

var a = "lemoncool";
var testFun = function(){
  a = '23';

testFun(); 
console.log(a);

此時控制台會輸出多少呢?是"23"。我想,這個例子,足以說明var是全局聲明的。

let 聲明

我們試着用let再次執行上面的例子:

var b = "lemoncool";
var testFun = function(){
  let b = '23';

testFun(); 
console.log(b);

函數執行后,再打印b,你覺得會輸出多少呢?結果是此時輸出的是"lemoncool"。為什么?

因為我們在函數里用通過let聲明了 b,這時的 b ="23"只在函數作用域內有效,屬於局部變量。外面的打印,拿不到函數的局部變量,所以拿不到"23"。

那如果我們只在函數體里聲明b,外部的聲明刪掉,打印就會輸出"23"么?

var testFun = function(){
  let b = '23';

testFun(); 
console.log(b);

不好意思,報錯了。不在外部聲明,即使函數里聲明再多花樣,外部依然拿不到。

上面兩個例子,說明了let聲明的是局部變量。let聲明的變量,只在區塊內起作用,外部拿不到,也是不可以調用的。有關作用域問題,大家可以自行查閱資料深入了解。

所以let不會存在變量提升的bug,可以有效防止數據污染。同時,let不允許在相同作用域內,重復聲明同一個變量。

在合理場景下,我們要努力去習慣用let代替var

const 聲明

在開發中,有些變量從聲明后就不允許改變。這種變量叫常量。這時就需要用到const聲明。

我們通過一個反例,看一段錯誤代碼:

const c = "lemoncool";
c = 'hello';
console.log(c);

執行這段代碼時,會報錯。原因是const聲明的變量不可改變。

const c = "lemoncool";
console.log(c); //"lemoncool"
const d; // SyntaxError: Missing initializer in const declaration

這段代碼同樣會報錯, 意味着,const一旦聲明必須初始化,否則會報錯。

圖片 Qconst聲明的變量初始化不允許再改變,是針對所有類型么?

A:答案是“”,簡單類型(數值 number、字符串 string 、布爾值 boolean),的確是這樣。但是對於復雜類型(對象 object,數組 array,函數 function),const只能保證變量指針是固定的,至於指針指向的數據結構,是否發生變化,就有些無法控制。所以使用 const 聲明復雜類型對象時要慎重。

圖片

暫時性死區

var temp = "lemoncool";
if (true) {
 console.log(temp);
 const temp = '123456';
}

你以為會輸出“lemoncool”?NO,會報錯。

ES6 明確規定,代碼塊內如果存在 let 或者 const,代碼塊會對這些命令聲明的變量從塊的開始就形成一個封閉作用域。 凡是在聲明之前就使用這些變量,就會報錯。

所以,在代碼塊內,使用letconst命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)。

上面代碼中,在const命令聲明變量temp之前,都屬於變量temp的“死區”。

 


到此,三種聲明方式的使用方法及注意事項已梳理完畢。沒有整理很細,因為細的知識點太多,不知從何說起。大家作為一個大綱,舉一反三。

下一節我們會一起討論【解構賦值】,感謝大家支持,希望大家在每一節中都有所得。

前端便利貼 公棕號【前端便利貼】記錄着一個程序媛的所見所得所想,分享日常技術筆記,內容覆蓋了閱讀、技術和個人思考~,關注公棕號更早獲取更多文章。

覺得有用的話,小手點點【推薦】再走吖~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM