let

let命令

基本用法

{
    let aLet = 1;
    var bVar = 2;
}
console.log(aLet);  // Uncaught ReferenceError: aLet is not defined(…)
console.log(bVar);  // 2
for (let i = 0; i < 3; i++) {}
console.log(i);  // Uncaught ReferenceError: i is not defined(…)
// 使用var变量
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6]();    // ?结果

// 使用let变量
var a = [];
for (let ii = 0; ii < 10; ii++) {
  a[ii] = function () {
    console.log(ii);
  };
}
a[6]();    // ?结果 

不存在变量提升

(function(){
  var str1 = "1";
  var fun1 = function(){};
  var str2 = "2";
  var str3 = "3";
})();
// 同上代码
(function(){
  var str1,fun1,str2,str3;
  str1 = "1";
  fun1 = function(){};
  str2 = "2";
  str3 = "3";
})();
console.log(foo); // undefined
console.log(bar); // Uncaught ReferenceError: bar is not defined(…)
var foo = 2;
let bar = 2;

暂时性死区

// 使用var
var tmp = 123;
if (true) {
  console.log(tmp);
  var tmp;
}
// 使用let,运行结果
var tmp = 123;
if (true) {
  console.log(tmp);
  let tmp;
}
// 未使用let语句
typeof myData;  
    
// 使用let语句
{
    typeof myData;
    let myData = 'myData';
}

不允许重复声明

// Uncaught SyntaxError: Unexpected token
function fun1() {
    let num1 = 10;
    var num1 = 1;
}
// Uncaught SyntaxError: Unexpected token
function fun2() {
    let num2 = 10;
    let num2 = 1;
}
function func(arg) {
  let arg; // 报错
}
function func(arg) {
  {
    let arg; // 不报错
  }
}

块级作用域

ES5全局作用域和函数作用域

// 场景一
var date = new Date();
function fun() {
  console.log(date);
  if (false) {
    var date = "hello world";
  }
}
fun();
    
// 场景二
var str = 'hello';
for (var j = 0; j < str.length; j++) {
  console.log(str[j]);
}
console.log(j);

ES6块级作用域

{{{{
  {let insane = 'Hello World'}
  console.log(insane); // Uncaught ReferenceError: insane is not defined
}}}};
{{{{
  let insane = 'Hello World';
  {let insane = 'Hello World'}
}}}};
// IIFE写法
(function () {
  var tmp = ...;
  ...
}());
    
// 块级作用域写法
{
  let tmp = ...;
  ...
}

块级作用域与函数声明

// 情况一
if (true) {
  function fun() {}
}
    
// 情况二
try {
  function fun() {}
} catch(e) {
}
// ES6严格模式
'use strict';
if (true) {
  function f() {}
}

Const

参考文章

  1. 变量作用域
  2. ES6入门