工做中使用ES6開發項目已經很長時間了,趁如今不忙,將ES6的知識點梳理一遍。一爲查漏補缺,二爲加深記憶。
let
與const
命令let
命令的特色1.不存在變量提高:即必選先聲明後使用,不然報錯
2.只在代碼塊中有效
3.暫時性死區
4.不容許重複聲明javascript
在ES5中,使用var聲明的變量,在腳本開始運行時,變量已經存在,只不過值爲undefined。java
console.log(v); //undefined var v = 'exit';
而let聲明的變量,必須先聲明後使用,不然會報錯。函數
console.log(v); //ReferenceError: v is not defined let v = 1;
在代碼快中,let聲明的變量,在該代碼塊以外是沒法訪問的。code
{ let a = 1; var b = 2; } console.log(a); // ReferenceError a is not defined console.log(b); // 2
一個經常使用的let技巧是配合for循環,以下代碼所示:對象
for(let i = 0; i<10; i++){} console.log(i); // Reference is not defined
ES6規定,若是一個做用域中存在let或const命令聲明的變量,這個做用域針對這些變量造成了封閉做用域,必須在該做用域中先聲明後使用。封閉做用域的意思是指,一樣名字的全局變量,將在這裏無效。以下代碼所示,ip
// global let a = 1; { console.log(a); // ReferenceError a is not defined let a = 2; console.log(a); // 2 }
下面是一個比較隱蔽的暫時性死區內存
function bar(x = y, y=2) { // ES6的默認參數,也是至關於在用let聲明瞭x與y一句, let x = y; return x + y } bar(); //ReferenceError y is not defined
跟var有區別的是var能夠對一個變量重複聲明,可是在同一個做用域中,let重複聲明同一個變量會致使錯誤。作用域
let a; let a; //SyntaxError:Identifier 'a' has already been declared
Q1: 塊級做用域是如何定義的?
A1:
Q2: 爲何須要塊級做用域?
A2:在ES5中只有全局做用域,與函數做用域(也就是內部做用域),可是這一般會致使兩個問題:
1.內部變量可能會覆蓋外部變量:開發
let tem = new Date(); function foo() { // 變量提示致使tem被覆蓋 console.log(tem); if(false){ //即使這裏不會執行,function做用域內變量會存在提高的狀況 var tem = 2; } } foo(); //輸出undefined
2.用來計數的循環變量泄露爲全局變量it
for(var i =0; i< 10; i++){ } console.log(i); // 10
塊級做用域出現以前,常常使用IIFE來處理私有變量的問題,避免別的代碼修改到某個變量。
而塊級做用域的出現,實際上使得普遍應用的當即執行函數表達式IIFE再也不須要了。
const
命令的特色const obj = {}; // 有效 obj.a = 1; obj = {}; //error 不能將obj指向兩個內存地址
ES6規定:1:var function關鍵字聲明的全局變量,依舊是頂層對象的屬性。2:let const class命令聲明的全局變量,不屬於頂層對象的屬性。
也就是說從ES6開始,全局變量屬性將逐步與頂層對象的屬性脫鉤。
// 全局做用域 var a = 1; console.log(window.a); //1 let b = 2; console.log(window.b); //undefined