es6 中let与const的简析

1、let

它的作用类似于var,用来声明变量,但是所声明的变量,只在let命令所在的代码块内有效。

if(true){

    var a = 1;

    let b = 2;

}

document.write(a);

document.write(b);  // 报错:ReferenceError: b is not defined

 

体会下letvar的作用域范围:

function f1() {

  var a = 8;

  let n = 5;

  if (true) {

      let n = 10;

      var a = 20

  }

  document.write(n); // 5

  document.write(a); // 20

}

f1();

 

2、let的应用

for循环的计数器,就很合适使用let命令。

var a = [];

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

  a[i] = function () {

    document.write(i);

  };

}

document.write(a[6]()); //6

 

如果把let换成var ,将输出10。这是由于let的块级作用域。

3、const

a、const 声明的是常量,一旦声明,值将是不可变的。

const PI = 3.1415;

PI // 3.1415 

PI = 3;

PI // 3.1415 

const PI = 3.1;

PI // 3.1415

 

b、const 也具有块级作用域

if (true) {

  const max = 5;

}

document.write(max);  // ReferenceError 常量MAX在此处不可得

 

c、const 不能变量提升(必须先声明后使用)

if (true) {

  document.write(MAX); // ReferenceError

  const MAX = 5;

}

 

d、const 不可重复声明

var message = "Hello!";

let age = 25;

// 以下两行都会报错

const message = "Goodbye!";

const age = 30;

const 指令指向变量所在的地址,所以对该变量进行属性设置是可行的(未改变变量地址),如果想完全不可变化(包括属性),那么可以使用冻结。

const C1 = {};

C1.a = 1;

document.write(C1.a); // 1

C1 = {};  // 报错  重新赋值,地址改变 

//冻结对象,此时前面用不用const都是一个效果

const C2 = Object.freeze({}); 

C2.a = 1; //Error,对象不可扩展

document.write(C2.a);

 

posted @ 2017-11-07 14:53  for_tomorrow  阅读(241)  评论(0编辑  收藏  举报