2

1 基本用法

ES6新增了let和const命令。前者用法类似于var用于声明变量,后者用于声明一个只读的的常量,声明后常量的值不能改变,这意味着const一旦声明常量,就必须立即初始化,不能留到以后赋值,否则将会报错。通过let和const命令声明的变量和常量都只在命令所在的代码块内有效。

{
  let a = 10;
  const b = 3;
  b = 3.14 // TypeError: Assignment to constant variable.
  var c = 1;
}
a //  ReferenceError: a is not defined.
b//  ReferenceError: b is not defined.
c // 1

for循环的计数器适用let命令,计数器i只在for循环体内有效,在循环体外引用将会报错。

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

第一段代码,变量i是var声明的,是一个全局变量,每一次循环都会改变i的值,因为a[1]到a[10]函数内的console.log(i)都指向同一个全局的i,所以运行结束输出的是最后一轮的i值。第二段代码,变量i是let声明,当前的i只在本轮循环有效,所以每一轮循环的i都是一个新的变量,于是最后输出5。

另外,for循环有一个有趣的地方,就是设置循环变量的那部分是一个父作用域,循环体内部是一个单独的子作用域。

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

正确后运行后连续输出3次adc。表面函数内部的i和计数器i不在同一个作用域。

2 基本特点

2.1 不允许重复声明

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

// 报错
function () {
  let a =  5;
  var a = 5;
  // 同let a = 3;
}

函数内也不能重复声明参数。

function (arg) {
  let arg; // 报错    
}

function (arg) {
  {
    let arg; // 不报错
  }
}
var card =  "hello";
let age = 20;
// 以下都报错
const card = "good";
const age = 30;

2.2 不存在变量提升

var命令会发展“变量提升”现象,变量在可以声明之前使用,值为undefined。let和const命令改变了这种行为,它们声明的变量和常量一定要在声明后使用,否则便会报错。

//let情况
console.log(a); // 报错
let a = 2;
//const情况
if(true){
  console.log(b); // 报错
  const b = 1;
}

2.3 暂时性死区

只要块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部的影响。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的,这在语法上成为暂时性死区。const命令同理。


BluesZ
27 声望4 粉丝

前端新手学习中