1.let 和 const 命令

回到目录

前言

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

回到目录

你可能感兴趣的:(1.let 和 const 命令)