因爲最近本人在學習ES6,作一些筆記可以更好的熟悉,就趁此機會來寫一篇關於ES6的新人學習摘要吧。但願大佬能夠給出一些意見,也但願和我同樣的新人能更好更快的瞭解和熟悉ES6。
首先在這邊我要感謝阮大大~有這麼好的入門教程(搬運工,部份內容不講述)。
其次註明本文只用於本人和其餘新手瞭解熟悉ES6,非其餘用途。
下面就開始咱們簡單的學習吧~html
很少贅述,ES6兼容性git
在學習let和const以前,咱們先來了解一下塊級做用域,塊級做用域主要適用兩種場景,一種是內層變量覆蓋外層變量;第二種場景是用來計數的循環變量泄露爲全局變量。es6
// 第一種場景 var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = 'hello world'; } } f(); // undefined // 第二種場景 var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
塊級做用域能很好的解決這兩方面的問題,如何增長塊級做用域呢?等咱們學習完let和const再來詳述。
一、let和var同樣,用來聲明變量,差異在於let申明的變量的做用域只針對於let命令所在的代碼塊內。github
{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1
在代碼塊中咱們分別以let和var申明瞭a,b兩個變量,在打印a,b兩個變量的時候發現用var聲明的變量b的值是能正確打印的,可是用let申明的a變量報錯,這表面二者申明的做用域不一樣。瀏覽器
用let申明的變量無變量提高函數
// var 的狀況 console.log(foo); // 輸出undefined var foo = 2; // let 的狀況 console.log(bar); // 報錯ReferenceError let bar = 2;
上面的代碼中一樣在聲明變量前打印出該變量,var申明的變量輸出undefined,而let報錯,即變量bar不存在,因此使用let必定要在申明後進行使用。學習
暫時性死區code
暫時性死區是什麼意思呢,簡單來講就是從一開始就造成了封閉做用域。凡是在聲明以前就使用這些變量,就會報錯。htm
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
不容許重複聲明教程
let不容許在相同做用域內,重複聲明同一個變量。
// 報錯 function func() { let a = 10; let a = 1; }
二、const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。
const聲明的變量不得改變值,這意味着,const一旦聲明變量,就必須當即初始化,不能留到之後賦值。
const的做用域與let命令相同:只在聲明所在的塊級做用域內有效。
const命令聲明的常量也是不提高,一樣存在暫時性死區,只能在聲明的位置後面使用。
const foo; // SyntaxError: Missing initializer in const declaration const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable. if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
三、塊級做用域
新增方式:
{{{{ let insane = 'Hello World'; {let insane = 'Hello World'} }}}};
優勢:使得得到普遍應用的當即執行函數表達式(IIFE)再也不必要了。
// IIFE 寫法 (function () { var tmp = ...; ... }()); // 塊級做用域寫法 { let tmp = ...; ... }
注意:只有在ES6中,容許如下三條規則(ES5不可)
四、do表達式(提案)
不贅述,使得塊級做用域能夠變爲表達式,也就是說能夠返回值
let x = do { let t = f(); t * t + 1; };