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