ES6定義變量

1、let命令

  1. 不存在變量提高。es5的var會存在變量提高問題,可是es6的letconst不會存在變量提高問題。
  2. 暫時性死區。只要在塊級做用域內存在let命令,它所聲明的變量就綁定在這個區域,再也不受外部的影響。es6明確規定,若是區塊中存在letconst命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域,凡是在聲明以前就使用這些變量,就會報錯。即便是使用typeof也會報錯。
var tmp = 123;

if(true){
    tmp = "abc"; //ReferenceError tmp is not defined
    let tmp;
}
複製代碼
  1. 不容許重複聲明。letconst不容許在相同的做用域內,重複聲明同一個變量。
// 報錯
function func() {
    let a = 10;
    var a = 1;
}

// 報錯
function func() {
    let a = 10;
    let a = 1;
}

//不能在函數內部從新聲明參數
function func(arg) {
    let arg; // 報錯
}

function func(arg) {
    {
        let arg; // 不報錯
    }
}
複製代碼

2、塊級做用域

  1. es5只有全局做用域和函數做用域,沒有塊級做用域。這可能致使不少不合理的場景。
//內層變量可能會覆蓋外層變量
var tmp = 123;

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
複製代碼
  1. es6的塊級做用域
function f1() {
    let n = 5;
    if (true) {
        let n = 10;
    }
    console.log(n); // 5
}
複製代碼
  1. es6容許塊級做用域的任意嵌套,塊級做用域的出現,使得普遍應用的當即執行函數表達式(IIFE)再也不必要,塊級做用域不返回值,除非它是全局變量。
// IIFE 寫法
(function () {
    var tmp = ...;
    ...
}());

// 塊級做用域寫法
{
    let tmp = ...;
    ...
}
複製代碼

3、const命令

  1. const聲明一個只讀的常量,一旦聲明,常量的值就不能改變。
  2. const一旦聲明變量,就必須當即初始化,不能留到之後賦值。
  3. const限定的是賦值行爲。
const a = 1;
a = 2;//報錯

const arr = [];
arr.push(1) //[1] 
//在聲明引用型數據爲常量時,const保存的是變量的指針,只要保證指針不變就不會保存。下面的行爲就會報錯

arr = [];//報錯 由於是賦值行爲。變量arr保存的指針改變了。
複製代碼

4、頂層對象屬性與全局變量

  1. 頂層對象,在瀏覽器環境指的是window對象,在 node 指的是global對象。ES5 之中,頂層對象的屬性與全局變量是等價的。
window.a = 1;
a // 1

a = 2;
window.a // 2
複製代碼
  1. es6中引入的letconstclass聲明的全局變量再也不屬於頂層對象的屬性。可是varfunction聲明的變量依然屬於全局對象的屬性。
var a = 1;
window.a // 1

let b = 1;
window.b // undefined
複製代碼
相關文章
相關標籤/搜索