ES6系列(一)let與const命令

前言

工做中使用ES6開發項目已經很長時間了,趁如今不忙,將ES6的知識點梳理一遍。一爲查漏補缺,二爲加深記憶。

letconst命令

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

三、暫時性死區(temporal dead zone, TDZ)

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命令的特色

  1. 聲明常量
  2. const 聲明的常量是引用類型的值時,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
相關文章
相關標籤/搜索