let、const用法类似于var,但所声明的变量(const声明的是常量,以下不再做说明)只能在命令所在代码块内使用。
例:var声明变量的for循环
var a=[];
for(var i=0;i<10;i++){
a[i]=function(){console.log(i)}
};
console.log(i,"我是var声明的变量i");
a[6]();
//10 "我是var声明的变量i"
//10
例:let声明变量的for循环
var a=[];
for(let b=0;b<10;b++){
a[b]=function(){console.log(b)}
};
a[6]();
//Uncaught ReferenceError: b is not definedconsole.log(b,"我是var声明的变量b");
//6
let、const不存在变量提升
例:var声明变量
console.log(c);//输出undefined
var c=1;
var tmp = new Date();
function f() {
console.log(tmp);//函数f
执行后,输出结果为undefined
,原因在于变量提升,导致内层的tmp
变量覆盖了外层的tmp
变量。
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined
例:let声明变量
console.log(d);//报错ReferenceError
let d=1;
暂时性死区
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
例:
var tmp=123;
if(true){
tmp=234; //报错ReferenceError,tmp is not defined
let tmp;
例:
}
var tmp=123;
if(true){
}let tmp;
tmp=234;
console.log(tmp); //234
不允许重复声明
例:function func() {
let z = 10;
var z = 1;}
func();//报错 Uncaught SyntaxError: Identifier 'z' has already been declared
let声明的变量属于块级作用域
例:function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5 (如果是var声明的变量会输出10);
}
这表示外层代码块不受内层代码块的影响
const声明的是一个只读的常量,一旦声明,常量的值不能改变且必须立即初始化,不能留到以后赋值。
例:const PI = 3.1415;
PI // 3.1415
PI = 3;//报错 Uncaught TypeError: Assignment to constant variable.
const a;//报错 Uncaught SyntaxError: Missing initializer in const declaration