让我们来看看es中let:
1、 let 声明只在当前块有效
{
let a = 1;
var b = 2;
}
console.log(a); //报错 a is not defined
console.log(b); //2
2、 let不会让我们的代码发生变量提升
console.log(a); //undefined
console.log(b); //报错 b is not defined
var a = 2; //变量a得到了提升
let b = 1; //变量b没有得到提升
3、let的区域绑定
var t = 123;
if(true) {
t = 5; //报错 t is not defined
let t;
}
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,
从一开始就形成了封闭的空间,凡是在声明之前使用这些变量就会报错
4、 let不能在相同作用域内,重复声明同一个变量
{
let a = 5;
var a = 3;
}
报错:Identifier 'a' has already been declared
{
let a = 5;
let a = 3;
}
function a (x){
let x = 3;
console.log(x);
}
a(5);
5、 let在不同作用域声明取名相同的变量,他们可以有自己的值,可以互不影响。
var t = 123;
if(true) {
let t;
t = 5;
console.log(t); //5
}
console.log(t); //123
分别运行下代码看会发生什么
for(let i=0; i<=5; i++){
setTimeout(function(){
console.log(i) //每个迭代重新绑定
},i*1000)
}
for(var i=0; i<=5; i++){
setTimeout(function(){
console.log(i)
},i*1000)
}
总结:let让代码更加严谨
let:
只在声明的作用域内有效
使用前必须先声明:1、不会让我们的变量发生提升
2、 区域绑定
不能重复声明: 在相同作用域内,只要存在let声明该变量,
就不能再次声明该变量(包括用let声明和其他如var,congst等声明都是不行的)
在不同作用域内,可以声明取名相同的变量,但是他们代表的含义并非相同
下面是一些小测试
function bar(x = y, y = 2){
return [x,y];
}
bar(); //报错
function bar(x = 2, y = x){
return [x,y];
}
bar();
var t = 123;
if(true) {
let t;
t = 5;
console.log(t); //5
}
console.log(t); //123