let 和 const

let 声明的变量只在所在的代码块有效。

  {
    let name = "kevin";
    var age = 20;
    console.log(name);    //kevin
    console.log(age);   //20
  }
    console.log(name);    //a is not defined
    console.log(age);   //20

for循环

let在循环体内有作用

  for (let i = 0; i < 3; i++) {
    console.log("i: ",i );    //i:0    i:1    i:2
  }
console.log(i) //is not defined

for循环还有一个特别之处,就是设置循环变量的那部分是一个父级作用域,循环体内部是一个单独的子作用域

  for (let ii = 0; ii < 3; ii++) {
    let ii = "kevin";
    console.log("ii: ",ii );       //输出3次Kevin
  }

不存在变量提升:

与var的区别

  console.log(name);    //undefined
  var name = "kevin";
  console.log(age);   //报错ReferenceError
  let age = 20;
  var sex = "girl";
  {
    let sex ="boy";
    console.log(sex); //boy
  }
  console.log(sex); //girl

将上面代码改写成

 var sex = "girl";
  {
    sex ="zhongxing";
    let sex ="boy";
    console.log(sex); //报错ReferenceError
  }
  console.log(sex); 

这段代码报错被称为:暂时性死区。

暂时性死区的本质是:只要一进入当前作用域,所要使用的变量就存在了,但不可取,只有声明后才可取和使用。

2.块级作用域

es5只有全局作用域和函数作用域,没有全局作用域。es6增加了块级作用域。

es6:
function fn(num) { let nums = 10; if(true){ let nums = 20; } console.log(nums); //10 } fn(8);
es5:
function fn(num) { var nums = 10; if(true){ var nums = 20; } console.log(nums); //20 } fn(8);

es6允许块级作用域任意嵌套。外层作用域无法读取内层作用域的变量。内层作用域可以定义外层作用域同名的变量。

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

const声明一个只读的常量。一旦声明变量,常量的值就不能变化。就必须立即初始化。不能留到以后赋值。const的作用域和let相同:只在声明的块级有效。同样存在暂时性死区

  const PI =3.14;
  {
    const PI = 3;
    console.log(PI);  //3
  }
  console.log(PI);  //3.14
原文地址:https://www.cnblogs.com/wangwenhui/p/7697081.html