1 基本用法
ES6新增了let和const命令。前者用法类似于var用于声明变量,后者用于声明一个只读的的常量,声明后常量的值不能改变,这意味着const一旦声明常量,就必须立即初始化,不能留到以后赋值,否则将会报错。通过let和const命令声明的变量和常量都只在命令所在的代码块内有效。
{
let a = 10;
const b = 3;
b = 3.14 // TypeError: Assignment to constant variable.
var c = 1;
}
a // ReferenceError: a is not defined.
b// ReferenceError: b is not defined.
c // 1
for循环的计数器适用let命令,计数器i只在for循环体内有效,在循环体外引用将会报错。
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[5] (); // 10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[5] (); // 5
第一段代码,变量i是var声明的,是一个全局变量,每一次循环都会改变i的值,因为a[1]到a[10]函数内的console.log(i)都指向同一个全局的i,所以运行结束输出的是最后一轮的i值。第二段代码,变量i是let声明,当前的i只在本轮循环有效,所以每一轮循环的i都是一个新的变量,于是最后输出5。
另外,for循环有一个有趣的地方,就是设置循环变量的那部分是一个父作用域,循环体内部是一个单独的子作用域。
for (var i = 0; i < 3; i++) {
let i = 'adc';
console.log(i);
}
//adc
//adc
//adc
正确后运行后连续输出3次adc。表面函数内部的i和计数器i不在同一个作用域。
2 基本特点
2.1 不允许重复声明
let和const不允许在相同的作用域内重复声明同一个变量。
// 报错
function () {
let a = 5;
var a = 5;
// 同let a = 3;
}
函数内也不能重复声明参数。
function (arg) {
let arg; // 报错
}
function (arg) {
{
let arg; // 不报错
}
}
var card = "hello";
let age = 20;
// 以下都报错
const card = "good";
const age = 30;
2.2 不存在变量提升
var命令会发展“变量提升”现象,变量在可以声明之前使用,值为undefined。let和const命令改变了这种行为,它们声明的变量和常量一定要在声明后使用,否则便会报错。
//let情况
console.log(a); // 报错
let a = 2;
//const情况
if(true){
console.log(b); // 报错
const b = 1;
}
2.3 暂时性死区
只要块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部的影响。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的,这在语法上成为暂时性死区。const命令同理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。