【ES6】let 命令
let命令:用于声明变量,类似于var,但声明的变量只在let命令所在的代码块作用域内有效。
最经典的对比:
//场景1:
var a=[];
for(var i=0;i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6]();//10
//场景2:
var a=[];
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6]();//6
场景1中,i是var声明的,只用来控制循环,但是循环结束后并没有消失,而是泄露成了全局函数,所以,i最终值为10;场景2中,i是let声明的块级变量,在每循环一次,就相当于重新创建一个新的变量,循环结束后总共创建了10个块级变量i,且他们之间不会相互影响,所以a[6]()的结果为6。
let 特性
不存在变量提升
let定义的变量一定要在声明后使用,否则报错。//let 和 var 对比
//场景1
console.log(s);//abc
var s=’abc’;//场景2
console.log(s);//ReferenceError
let s=’abc’;//场景1在执行时时这样的:
var s=’abc’;//定义语句会被提升上来
console.log(s);//abc暂时性死区
只要块级作用域内存在let命令,它声明的变量机会“绑定”(binding)在这个区域,不再受外部影响。if(true){
s='abc';
console.log(s);//ReferenceError
let s; //这里是导致上面报错的原因
console.log(s);//undefined
s='abc';
console.log(s);//abc
}
//尝试理解这段代码,就能明白暂时性死区,let声明后才能使用。不允许重复声明
let不允许在相同作用域内重复声明同一变量,内层作用域可以声明外层作用域的同名变量。(这里重点强调同一作用域)//报错
function(){let a=10;
var a=10;
//var a=10;
//let a=10;
}
//报错
function(){let a=10;
let a=1;
}
因此,不能再函数的内部重新声明参数。
function(i){
let i; //报错
}
function(i){
{
let i; //不报错
}
}
ES5中仅有两种方法声明变量:var命令 和 function命令,而ES6一共有6种,除了var | let | function 外还有三种方法:const | import | class ,下次总结。
还没有评论,来说两句吧...