let命令和块级作用域

学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多。

一、let命令
1、概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在的代码块内生效。
2、使用:适用于for循环的变量声明。

for (let i = 0;i < 10;i++) {
  let i = "a";    
}
// for循环里面的两个i是不同的,并且属于不同的作用域。第一个i属于是for循环的循环变量的父作用域,第二个i属于是for循环的循环体的一个单独的子作用域。
console.log(i);    // ReferenceError: i is not defined

3、与ES5的区别:
(1)ES6中的let命令不存在变量提升的问题。ES5中变量可以在声明之前使用,值为undefined。

// ES5:
console.log(example);    // undefined
var example = "hello world";

// ES6:
console.log(example);    // ReferenceError: example is not defined
let example = "hello world";

(2)暂时性死区。在代码块中,使用let命令所声明的变量在声明之前都是不可用的。在语法上,称为“暂时性死区”(temporal dead zone)TDZ。

{
    // 死区开始 -> 代码块的开始
    console.log(temp);
    let temp = "";	// 死区结束 -> 使用let变量声明了temp
}

(3)不允许重复声明。

function fun1() {
  let a = "1";
  var a = "2";	
}

fun1();	// Identifier 'a' has already been declared

function fun2() {
  let a = "1";
  let a = "2";	
}

fun2();	// Identifier 'a' has already been declared

二、块级作用域
1、为什么需要块级作用域?
(1)内层变量可能会覆盖外层变量。
(2)用来计数的循环变量泄露为全局变量。

var date = new Date();

function f() {
  console.log(date);
  if (false) {
    var date = "hello world";
  }
}
// if代码块的外部使用内层的date变量,内部使用内层的date变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的date变量覆盖了外层的date变量。
f();	// undefined

// 用来计数的循环变量泄露为全局变量
var str = 'hello world';
for (var i = 0;i < str.length;i++) {
  // ...
}
// console.log(i);	// 5
posted @ 2018-04-09 17:56  小凤凰  Views(917)  Comments(0Edit  收藏  举报