ES6新增两个变量声明的关键词
let
和const
。
let
声明的变量只在当前代码块中有效,该变量在别的代码块中则无效,也就是说let
声明的变量的作用域更小,相比var
声明的全局变量,let
的声明方式操作起来简洁许多。
const
声明一个常量,一旦声明,则该常量的值就无法更改了。
一、let
声明
{
let a = 0;
console.log(a) //输出:0
}
console.log(a) //报错:Uncaught ReferenceError: a is not defined
在花括号里是一个代码块,可以正常引用变量a,在花括号外应用则报错。
1.1 不能重复声明
{
let a = 1;
let a = 2;
console.log(a) //报错: Uncaught SyntaxError: Identifier 'a' has already been declared
var b = 3;
var b = 4;
console.log(b) //输出:4
var c = 5;
let c = 6;
console.log(c) //报错:Uncaught SyntaxError: Identifier 'c' has already been declared
}
let
不允许重复声明同一个变量,否则会报错,如果先用var声明一个变量,再用let覆盖声明,这样也是行不通的,依然报错。
因为这个特性let
非常适合for循环计数器
{
// var方式
for(var i=0; i<10; i++){
setTimeout(function(){
console.log(i); //最终输出十个10
})
}
//let方式
for(let j=0; j<10; j++){
setTimeout(function(){
console.log(j); //依次输出0~9
})
}
}
setTimeout
定时器里的i
是全局变量,而setTimeout
会在整个循环结束时才执行,因为整个循环结束时,i
在被循环时依次被递增到了10,才退出整个循环。这时候setTimeout
开始执行,所以会输出十个10。
而let
声明方式在每次循环(每次循环都时一个独立的代码块)的时候,j
都被重新声明,所以循环结束时setTimeout
里的j
就是0~9的十个数。
1.2 不存在变量提升
{
console.log(a); //undefined
var a = 0;
console.log(b); //报错:Uncaught ReferenceError: a is not defined
let b = 0;
}
var
存在变量提升,当程序开始运行时,变量a就已经存在了,只不过还没有赋值,所以报undefined。
let
不存在变量提升,当程序开始运行时,变量b并不存在,所以报错。