前言
ES 2015 之后新增了一种作用域---块级作用域
下面用到的 let const 都是在块级作用域里生效的
例如:
{
let a = 10;
var b = 1;
}
a; // ReferenceError: a is not defined.
b; // 1
let 命令
序号 | 特点 | 介绍 |
---|---|---|
1 | 块级作用域内生效 | 代码块{} 内声明的变量只能在{}内使用,出去了就没有了 |
2 | 不存在变量提升 | 所有变量必须先声明后使用,否则报错 |
3 | 暂时性锁区 | 只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 |
4 | 不允许重复声明 | let 不允许在相同作用域内,重复声明同一个变量。 |
例子
1.块级作用域内生效
{
let a = 10;
var b = 1;
}
a; // ReferenceError: a is not defined.
b; // 1
2.不存在变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
3.暂时性锁区
if (true) {
// TDZ开始
tmp = "abc"; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
4.不允许重复声明
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
function func(arg) {
let arg; // 报错
}
function func(arg) {
{
let arg; // 不报错
}
}
const 命令
基本用法
const 声明一个只读的常量。一旦声明,常量的值就不能改变
特别提示
const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
特点
let 具有的特点 const 同样也具有
序号 | 特点 | 解释 |
---|---|---|
1 | 声明之后不能修改变量的值 | 见特别提示 |
2 | 声明之后必须初始化 | 特点 1 决定的 |
例子
1.声明之后不能修改变量的值
const PI = 3.1415;
PI; // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
2.声明之后必须初始化
const foo;
// SyntaxError: Missing initializer in const declaration
3.声明的是个引用类型
const obj = { a: 15 };
obj.a = 16;
obj.a; // 16
ES6 声明变量的六种方法
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
名称 | var | function | let | const | import | class |
网友评论