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

浙公网安备 33010602011771号