一、let和const命令
let和var的区别
let声明的变量只在当前所在的代码块内有效
{
let a=1;
var b=2;
}
console.log(a);//Uncaught ReferenceError: b is not defined
console.log(b);//2
let 声明的变量在代码块之外访问会报错
不存在变量提升
var命令会发生变量提升,即变量可以在声明之前使用
let命令声明的变量,一定要在声明后使用,否则会报错
consoele.log(a);//输出undefined
var a=5;
console.log(b);//报错
let b=1;
暂时性死区
只要块级作用域中存在let命令,它所声明的变量就绑定在这个区域,不再受外部的影响
var a=1;
if(true){
console.log(a);//Uncaught ReferenceError: a is not defined
let a=5;
}
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
不允许重复声明
let 不允许在相同作用域内重复声明一个同一个变量
function test(){
let a=1;
let a=2;//报错
}
块级作用域
let实际上为函数新增了块级作用域
function test() {
let a = 10;
if(true){
let a=5;
}
console.log(a)
}
test();//输出10
证明外层外码块不受内层代码块的影响
ES6允许块级作用域的嵌套
外层作用域无法读取内层作用域的变量
{
{
{let a=5}
console.log(a);//报错
}}
块级作用域与函数声明
ES6引入了块级作用域,明确规定允许在块级作用域中声明函数,函数声明类似于let,在块级作用域之外不能使用
function f() { console.log(‘I am outside!’); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
上面代码在 ES5 中运行,会得到“I am inside!”,ES6 就完全不一样了,理论上会得到“I am outside!”。因为块级作用域内声明的函数类似于let,对作用域之外没有影响。
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。