1. 程式人生 > >es6語法

es6語法

gif () 泄露 提升 splay sig def mil uncaught

一、 let

1、es6新增了let命令,用來聲明變量。它的用法類似於var,但是所聲明的變量,只在let命令所在的代碼塊內有效。

<script>
    {
        var a = 10;
        var a = 20;
    }
    console.log(a);   // 20

    {
        let b = 10;
        console.log(b)   // 10
    }
    console.log(b)   // Uncaught ReferenceError: b is not defined
</script>

上面代碼在代碼塊之中,分別用let

var聲明了兩個變量。然後在代碼塊之外調用這兩個變量,結果let聲明的變量報錯,var聲明的變量返回了正確的值。這表明,let聲明的變量只在它所在的代碼塊有效

var a = [];
for(var i = 0; i < 10; i++){
    a[i] = function () {
         console.log(i);
    };
}
a[5]()    // 10

// ******************************
var b = []; for(let i = 0; i < 10; i++){ b[i] = function () { console.log(i); }; } b[
5]() // 5

2、不允許重復聲明

let不允許在相同作用域內,重復聲明同一個變量。

function func() {
     let a = 10;
     var a = 1;
     return a;
}
console.log(func());  // Uncaught SyntaxError: Identifier ‘a‘ has already been declared


// ******************************
function func() { let a = 10; let a = 1; return a; } console.log(func());
// Uncaught SyntaxError: Identifier ‘a‘ has already been declared
技術分享圖片
function func(arg) {
  let arg; // 報錯
}

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

3、為什麽需要塊級作用域

3.1、內層變量可能會覆蓋外層變量

var a = 10;
function func(){
    console.log(a)
    var a = 5;
}
func()   //undefined

上面代碼原因在於變量提升,導致內層的a變量覆蓋了外層的a變量。

3.2、用來計數的循環變量泄露為全局變量

var s = ‘hello‘;

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i);  // 5

上面代碼中,變量i只用來控制循環,但是循環結束後,它並沒有消失,泄露成了全局變量。

二、const

const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。

const PI = 3.1415926;
PI   // 3.1415926

PI = 3;  // TypeError: Assignment to constant variable.

const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以後賦值

const foo;
// SyntaxError: Missing initializer in const declaration

// 對於const來說,只聲明不賦值,就會報錯

const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。

if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined

es6語法