ES6-let 和 const 命令

2019-06-12  本文已影响0人  chrisghb

参考文章:let 和 const 命令

本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。

一、let 命令

// 在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值
{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1

下面的代码如果使用var,最后输出的是10。如果使用let,声明的变量仅在块级作用域内有效,最后输出的是 6

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10
for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}
// abc
// abc
// abc

上面代码正确运行,输出了 3abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。(temporal dead zone,简称 TDZ)。
这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错。

if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

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

// 报错
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; // 不报错
  }
}

二、块级作用域

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

这表明let定义变量,外层代码块不受内层代码块的影响。如果两次都使用var定义变量n,最后输出的值才是 10

// IIFE 写法
(function () {
  var tmp = ...;
  ...
}());

// 块级作用域写法
{
  let tmp = ...;
  ...
}

三、const命令

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.
const foo;
// SyntaxError: Missing initializer in const declaration
if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined
if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}

var message = "Hello!";
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
上一篇下一篇

猜你喜欢

热点阅读