Let、Const
1、 es6新增了两个关键字let、const用于控制作用域
2、 let:用法类似于var,但所声明的变量只在let命令所在的代码块中有效
{
let a=10;
var b=1;
}
console.log(b); //1
console.1og(a); //报错
3、 var、let比较:
var a=[];
for(var i=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
a[6]();
// 输出10。因为a[i]的函数在for的局域下,它的i使用的是for内的i,因此无论外面a[i]()为多少都是循环完毕才出来
var a=[];
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
a[6]();
// 输出6,每次循环使用的都是当次的i
4、for循环会形成两层作用域,设置循环变量的部分是一个父作用域,循环内部又是一个独立的子作用域
for(let i=0;i<3;i++){
let i='abc';
console.log(i);
}
// 输出三次abc。
5 、var声明的变量存在变量提升,let没有。
6、暂时性死区:在代码块内,使用let前该变量都是不可用的,这个区域被称为暂时性死区
在区块中若存在Let、const则此区块对这些命令声明的变量从一开始就形成封闭作用域
var temp=123;
if(ture){
temp='avc';
let temp;
}
// 出错。
7、存在let的声明命令,同一代码块的同一变量不允许重复声明
function fn(){
let a=0;
let a=10;
var a=1;
}
// 出错。
8、作用域链:每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。
当JavaScript查找变量x的时候(变量解析,variable reso1ution),会从当前作用域开始跟随作用域链向.上查找,直到找到x变量的声明,若到达全局作用域中仍未找到,则抛出一个引用错误(ReferenceError) 异常
9、 es5只有全局和函数作用域,从而会导致一些问题出现
(1)、内层变量可能会覆盖外层变量
var tmp=new Date() ;
function f(){
console. log(tmp) ;
if(false){
var tmp='hello' ;
}
}
f();
// undefined
(2)、用来计数的循环变量泄露为全局变量(因此for循环的计数器很适合使用let)
var s='hello';
for(var i=0;i<s.length;i++)
{
console.log(s[i]);
// h e l l o
}
console.log(i);
// 5
10、 块级作用域可以任意嵌套
11、 const只读,一旦被声明就不能改变且要立即初始化。其余用法同let。最好在声明常量时使用。
const foo={y:10};
foo.x=100;
console.log(foo.x);
// 输出100
foo={n:1000};
// 报错。
// 引用被改变。
12、 当常量保存的不是一个值,而是一个地址的时候,该常量所引用的对象是可以更改成员的,只是不能更改该常量保存的地址。
13、 let、const不会关联到顶层对象window,var可以