让前端飞程序员我爱编程

【ES6】let 与 const 用法这些就够了

2018-12-04  本文已影响9人  虹猫1992

ECMAScript与JavaScript的关系

ECMAScriptJavaScript语言的国际标准,JavaScriptECMAScript的实现。

let 与 const 的用法

let 用来声明变量,所声明的变量只在let命令所在的 代码块 内有效。

const 用来声明常量,所谓常量就是物理指针不可以更改的变量。

1、代码块与块级作用域

{
    let a = 1;
}
console.log(a)  // 报错 a is not defined

块级作用域特性

(1)ES6 允许块级作用域的任意嵌套

{{{{{let insane = 'Hello World'}}}}};

(2)外层作用域无法读取内层作用域的变量

{{{{
  {let insane = 'Hello World'}
  console.log(insane); // 报错
}}}};

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

{{{{
  let insane = 'Hello World';
  {let insane = 'Hello World'}
}}}};

2、let指令

{
  let a = 10;
  var b = 1;
}

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

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined;但let所声明的变量一定要在声明后使用,否则报错。

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

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

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(TDZ)。

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

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

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

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

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

for循环的计数器,很合适使用let命令,在for 循环中使用let定义变量,只在for的循环周期内可以使用,在循环体外引用就会报错

for (let i = 0; i < 10; i++) {
  // ...
}

console.log(i);
// ReferenceError: i is not defined

for循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}
// abc
// abc
// abc

3、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;
const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性

4、ES6 声明变量的六种方法

上一篇 下一篇

猜你喜欢

热点阅读