[ES6学习笔记] ES6中的let和const

ES6的标准已经在2015年的年末敲定,作为前端人,由于项目的需要,是时候开始着手学些ES的特性了。这里将记录着我学习ES6的点点滴滴。用于分享和记下我的学习历程。

NodeJS已经支持了ES6的一部分特性,但由于ES6中的新特性,使得它和ES5在运行时存在一些差异,这些差异足以使运行结果千差万别,因此,Node默认还是使用ES5来执行代码的。当你需要NodeJS以ES6的形式运行时,除了可以使用node --harmony xx.js之外,还可以在代码中使用'use strict'进入严格模式,这样Node就会支持ES6的特性了。

let

let和var一样,是声明变量的方式。var将在当前作用域下声明变量,如果是在全局中声明,则创建的变量作用域将在全局中使用,这个特性使得JS的闭包出现,也是JS和一般其他语言最容易混淆的地方。然而let方式,将变量按照类似Java和C++的方式声明,即它的作用域只在当前的代码块中。

例如:

var a = 5;  
{
    let a = 6;
    console.log(a); //6
}
console.log(a); //5  

与此同时,let可以在不同代码块中记录不同的变量状态。例如下面这个例子:

'use strict';  
var arr = [];  
for (var i = 0; i < 5; i++){  
    var t = i;
    arr[i] = function (){
        console.log(t);
    }
}
arr[2](); //4  

由于arr中的每一个函数访问了t,因此,这个函数成为了闭包,t在循环执行时,永远只有一个,因此,t在循环中一直在改变值。因此,当执行第三个函数时,输出的t也是循环结束时的4。但是,如果我们改成let,就完全不同了。

'use strict';  
var arr = [];  
for (var i = 0; i < 5; i++){  
    let t = i;
    arr[i] = function (){
        console.log(t);
    }
}
arr[2](); //2  

由于let只在当前的块中有效,因此,每一个循环体中,都有一个独立的t。

块级作用域使得let的变量在不同块中式独立存在的。例如:

'use strict';  
let a = 1;  
if (1){  
    let a = 2;
}
console.log(a); //1  

需要注意的是,let在相同的块中,不能重复声明,这一点和var不同。

let a = 1;  
let a = 2; //报错  
var a = 3; //报错  

const

const是声明常亮的方法,在使用const声明一个常亮之后,任何的赋值语句都将不起作用。当然,任何的赋值和修改,都不会引起程序报错,只是悄悄的不生效而已。

const A = 1;  
A += 1; //无效  
console.log(A); //1  

注意,在使用node4.1时,发现这种直接给A修改值得语句将会在编译器中报错。