let 和 const 命令

es6的一些知识点,阅读ECMAScript 6 入门心得和总结

let

  1. let命令所在的代码块内有效
{
 let a = 10;
 var b = 1;
}
a // ReferenceError: a is not defined.
b // 1

//for循环的计数器,就很合适使用let命令。
for (let i = 0; i < 10; i++) {
 // ...
}
console.log(i);
// ReferenceError: i is not defined

//var 和 let 的区别
var a = [];
for (var i = 0; i < 10; i++) {
 a[i] = function () {
   console.log(i);
 };
}
a[6](); // 10

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

//函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
for (let i = 0; i < 3; i++) {
 let i = 'abc';
 console.log(i);
}
// abc
// abc
// abc
  1. let 不存在变量提升
    变量提升:var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
  1. let 会造成暂时性死区
    ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
var tmp = '123';
if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

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

  tmp = 123;
  console.log(tmp); // 123
}
  1. let不允许重复声明

const

const声明一个只读的常量。一旦声明,常量的值就不能改变。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

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