title: let

Let 语句

let(声明变量)声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。

let允许你声明一个作用域被限制在块级中的变量、语句或者表达式。与var关键字不同的是,var声明的变量只能是全局或者整个函数块的。

块级作用域

let实际上为 JavaScript 新增了块级作用域。(let被限制在大括号里{})

  1. function f1() {
  2. let n = 5;
  3. if (true) {
  4. let n = 10;
  5. }
  6. console.log(n); // 5
  7. }

let声明的变量只在它所在的代码块有效

  1. {
  2. let a = 10;
  3. var b = 1;
  4. }
  5. a // ReferenceError: a is not defined.
  6. b // 1

ES6 允许块级作用域的任意嵌套且外层作用域无法读取内层作用域的变量

  1. {
  2. {
  3. {let insane = 'Hello World'}
  4. console.log(insane); // 报错
  5. }
  6. };

内层作用域可以定义外层作用域的同名变量

  1. {
  2. let insane = 'Hello World';
  3. {let insane = 'Hello World'}
  4. };

不存在变量提升

  1. // var 的情况
  2. console.log(foo); // 输出undefined
  3. var foo = 2;
  4. // let 的情况
  5. console.log(bar); // 报错ReferenceError
  6. let bar = 2;

暂时性死区

  1. if (true) {
  2. // TDZ开始
  3. tmp = 'abc'; // ReferenceError
  4. console.log(tmp); // ReferenceError
  5. let tmp; // TDZ结束
  6. console.log(tmp); // undefined
  7. tmp = 123;
  8. console.log(tmp); // 123
  9. }

不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

  1. function () {
  2. let a = 10;
  3. var a = 1;
  4. }
  5. // 报错
  6. function () {
  7. let a = 10;
  8. let a = 1;
  9. }
  10. // 报错

因此,不能在函数内部重新声明参数。

  1. function func(arg) {
  2. let arg; // 报错
  3. }
  4. function func(arg) {
  5. {
  6. let arg; // 不报错
  7. }
  8. }