[ES6] let and const

2019-08-12  本文已影响0人  EmilioWeng

let

ES6新增的let命令,用来声明变量,但是声明的变量只在声明所在的代码块中有用。

// let的块级作用域
function test(){
  for(let i = 0; i < 2; i++){
    console.log(i); //可以输出
  }
  console.log(i); //undefined
}

像for循环中的计数器,就非常适合使用let来定义

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

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

需要注意let不能重复声明变量,也不能在函数内部重新声明参数

//let不能重复定义
function demo(){
  let i = 0;
  let i = 1; //会报错,i重复定义了
}

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

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

var在使用中存在有变量提升的现象,就是变量可以在声明前使用,为undefined,而let并不支持这种做法,如果在let声明前使用,会报错ReferenceError。

// var
console.log(a); // undefined
var a = 2;

// let
console.log(b); // 报错 ReferenceError
let b = 2;

暂时性死区
在块级作用域中使用let声明变量,被声明的变量就会绑定这个块级作用域,不再受到外部的影响。

var test = 123;
if (1<2) {
  test = 'test'; // ReferenceError 此时的test以及绑定了let声明的test,与外部无关
  let test;
}

const

// const
function getPi(){
  const PI = 3.1415926;
  console.log(PI); 

  PI = 8;//会报错,PI is read-only
  console.log(PI);
}
//const和let一样是存在块级作用域的
//const在声明时必须赋值
//const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

需要注意的是,const在声明常量后是不能重新赋值的,但是const声明Object后,Object对于的内容是可变的。

function test(){
  const o = {
    a : 1
  }
  o.b = 2; //不会报错
  console.log(o);
}

因为Object是引用类型,对象最终的返回值是该对象在内存中的地址,也就是声明的o这个对象其实就是指向了内存中的地址,而这个地址是不可变的,但是对象本身是可变的。因此,将一个对象声明为常量必须非常小心。

上一篇 下一篇

猜你喜欢

热点阅读