ES6-let和const命令
在阮一峰老师的ES6文章中,已经很详细的介绍了let和const命令.
let命令
let命令
是ES6新增的,用来声明变量。用法类似于var
,但是let命令只在代码块内有效。
- 基本用法
{
let b = 10000;
var c = 1000;
}
b // 报错:ReferenceError:a is not defined
c // 1000
- 循环中使用
let命令
for(let i = 0; i < 5; i++){
//segment
//...
}
console.log(i);//ReferenceError:i is not defined
for(var i = 0;i < 5; i++){
//segment
//...
}
console.log(i);//5
let 定义的i只在循环体中有效,而var命令定义的i是全局的变量
- let不存在变量提升
//var命令的变量提升
console.log(aaa);
var aaa = 2;
//等价于
var aaa;
console.log(aaa);
aaa = 2;
//let命令不存在变量提升
console.log(bbb);//报错ReferenceError
let bbb = 2;
-
暂时性死区
-
只要块级作用域内存在
let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响 -
在代码块内,使用
let
命令声明变量之前,该变量都是不可用的
-
var a = 111;
if (true){
a = 222;//ReferenceError
let a;
}//在let命令声明变量tmp之前,都属于变量tmp的“死区”。
- 不允许重复声明
{
let a = 10;//let命令重复声明,导致报错
var a = 100;
let b = 100;//相同报错,不可重复声明
let b = 10;
}
块级作用域
所谓块级作用域
,就是一个代码块
,由一个花括号
包裹。
//举例1:以下就是一个最普通的代码块
{
//segment1;
//segment2;
//segment3;
//...
}
//举例2:这是一个for循环
// 花括号中也是一个代码块,let命令定义的a只在这循环中有用
for(let i = 0 ; i < 2 ; i++){
let a = 10;
var b = 0;
}
console.log(a);//报错
console.log(b);//0
- 块级作用域可以任意嵌套
{
{
{
{
let c = 0;
}
console.log(c);//报错
}
}
}
const命令
const命令
声明的是一个只读的常量。
- 一旦声明,常量的值就不允许改变。
const PI = 3.1415926;
console.log(PI);//3.1415926
PI = 3;
//TypeError: Assignment to constant variable.
- 一旦创建,必须赋初值
const PI;
//SyntaxError:Missing initializer in const declaration
作用域
与let命令
相同:只在声明所在的块级作用域内有效
{
const PI = 3.1415926;
}
console.log(PI);//Uncaught ReferenceError:PI is not defined
const命令
不存在提升
console.log(PI);//ReferenceError
const PI = 3.1415926;
顶层对象的属性
顶层对象,在流浪器环境指的是window对象
- 顶层对象的属性赋值与全局变量的赋值
window.a = 1;
console.log(a);//1
a = 2;
window.a //2
var命令
和function命令
声明的全局变量,依旧是顶层对象的属性let命令
、const命令
、class命令
声明的全局变量,不属于顶层对象的属性