ES6: let和const命令
2019-01-12 本文已影响0人
Yin先生
let命令(声明变量)
1.不存在变量提升
// var的情况
console.log(foo); //输出undefined
var foo = 2;
// let的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
在以上代码中,用var声明的变量会发生变量提升,即脚本运行时变量foo便已经存在,但是没有值,所以会输出undefined。 变量bar用let命令声明则不会发生变量提升。这表示在声明它之前,变量bar是不存在的,用let声明的变量一定要在声明之后使用,否则便会报错,这就是为什么它不存在变量提升的这个问题。
2.暂时性死区
ES6明确规定,如果块区中存在let和const命令,则这个块区对这些命令声明的变量从一开始就形成了封闭作用域,只要在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let声明变量之前,该变量都是不可用的。这在语法上称为“暂时性死区”。
暂时性死区本质:只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
3.不允许重复声明
let不允许在相同作用域内重复声明同一个变量。
// 报错
function () {
let a = 10;
var a = 1;
}
// 报错
function () {
let a = 10;
let a = 1;
}
不能在函数内部重新声明参数
function func (arg) {
let arg; // 报错
}
function func (arg) {
{
let arg; // 不报错
}
}
4.ES6的块级作用域
let实际上为JavaScript新增了块级作用域。
下面代码表示外层代码块不受内层代码块的影响。
function () {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
ES6允许块级作用域的任意嵌套,但是外层作用域无法读取内层作用域的变量。
{{{{
{ let insance = 'Hello World' }
console.log(insane); // 报错
}}};
内层作用域可以定义外层作用域的同名变量。
{{{{
let insane = 'Hello World';
{ let insane = 'Hello World' }
}}}};