es6语法

一、 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>

上面代码在代码块之中,分别用letvar声明了两个变量。然后在代码块之外调用这两个变量,结果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

 

posted @ 2018-05-22 09:27  笨笨侠  阅读(122)  评论(0编辑  收藏  举报