ES6 let 与 const声明
了解更多请访问https://www.runoob.com/w3cnote/es6-let-const.html
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
一.let声明
1、代码块内有效
let 是在代码块内有效,var 是在全局范围内有效
// ES6 新增了一个新的变量声明:let,它和 var 变量声明非常的类似
//块级区域
{
var value = 10;
let count = 20;
}
console.log(value); //10
console.log(count); //报错
2、不能重复声明
let 只能声明一次 var 可以声明多次
// var 声明可以重复声明同一个变量,后面会取代前一个变量
// let 声明不可以重复声明一个变量,会直接报错,就算其中一个是 var
let a = 1;
let a = 2;
var b = 3;
var b = 4;
console.log(a); //报错
console.log(b); //4
3、不存在变量提升
let 不存在变量提升,var 会变量提升
// let 声明方式,就算在后面声明,前面的输出依然是引用错误
console.log(value); //undefined
var value; //变量提升导致逻辑怪异
console.log(count); //引用错误
let count;
变量 value用 var 声明存在变量提升,所以当脚本开始运行的时候,value 已经存在了,但是还没有赋值,所以会输出 undefined。
变量 count 用 let 声明不存在变量提升,在声明变量 count 之前,count 不存在,所以会报错。
4、暂时性死区
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。码块内,在声明变量 value 之前使用它会报错。
如果在 let 声明前使用变量,这段区域被称为“临时死区(或暂时性死区)。
var vlaue = 20;
if(true){
//死区开始
console.log(value);
//死区结束
let value = 10
console.log(value);
}
5、实例
在循环中,var 和 let 的区别尤为明显,let 只在循环内部有效。
var 全局有效,导致后续再使用 i 会引起干扰,而 let 则不会。
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出十个 10
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789
变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
二、const 声明
const 声明的作用是:创建一个只读的常量,一旦声明不可改变;
和 let 声明一样,const 声明的常量无法提升,也存在临时死区;
和 let 不同的是,const 声明后必须立刻赋值,否则会报错;
1、基本用法
const PI = 3.14;//常量约定俗成大写
console.log(PI);