JS关键字let和const
ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。
let关键字
let关键字声明的变量只在let命令所在的代码块内有效
{
let a = 0;
a // 0
}
a // 报错 ReferenceError: a is not defined
let关键字声明的变量只可以声明一次,但是var声明的变量可以多次被声明
for(let j = 0;j<10; j++){
setTimeout(function(){
console.log(j);
})
}
变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";
变量 b 用 var 声明存在变量提升,所以当脚本开始运行的时候,b 已经存在了,但是还没有赋值,所以会输出 undefined。变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错。
const关键字
const关键字声明一个只读的常量,一旦声明,常量的值就不能改变。因此变量一旦声明必须初始化,否则会报错。
const PI = "3.1415926";
PI // 3.1415926
const MY_AGE; // SyntaxError: Missing initializer in const declaration
暂时性死区
var PI = "a";
if(true){
console.log(PI); // ReferenceError: PI is not defined
const PI = "3.1415926";
}
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。
学习参考
菜鸟教程https://www.runoob.com/w3cnote/es6-let-const.html