let 和 const 命令
let
和const
都是用来声明变量的ES6新增了块级作用域
- 任何带有花括号
{}
的,就是一个块级作用域- 像
while(){}
、if(){}
、for(){}
、function(){}
等等
- 像
- 在块级作用域中,变量由
let
和const
声明的话,该变量在块级作用域外,访问不到
- 任何带有花括号
- 函数声明位置的问题
- ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
- 但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数
- ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。
- ES6 规定,块级作用域之中,函数声明语句的行为类似于
let
```javascript // 案例二 // ES5时,经常使用匿名立即执行函数(IIFE),避免变量声明重复,而导致相互覆盖影响 // 块级作用域的出现,使得IIFE不再必要// 案例一
{
let a = 5;
console.log(a); // 5
}
console.log(a); // 报错。相当于未声明变量,就使用变量
- ES6 规定,块级作用域之中,函数声明语句的行为类似于
- ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
// IIFE 写法 (function(){ var a = 456; })() // 块级作用域的写法 { let a = 456; }
```javascript
// 案例三
// ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。
// 第一种写法,报错
if (true) let x = 1;
// 第二种写法,不报错
if (true) {
let x = 1;
}
// 案例四
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
// 浏览器是 ES5 的环境下,相当于
function f() { console.log('I am outside!'); }
(function () {
// 变量提升
function f() { console.log('I am inside!'); }
if (false) {
}
f(); // 打印出I am inside!
}());
// 浏览器是 ES6 的环境下,相当于
function f() { console.log('I am outside!'); }
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
let 的特点
- 使用
let
命令声明的变量,不存在变量提升
即要求变量一定要在声明后使用,否则报错
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
使用
let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
不允许重复声明
// 报错
{
let a = 1;
let a = 2;
}
// 报错
{
var a = 1;
let a = 2;
}
const 的特点
let
的三个特点,const
也有- 另外,
const
在声明时必须赋值,否则报错