let和var的区别
let是ES6新增的一个命令,用于声明变量,用法类似于var,但是还是有所不同,直接上代码:
var
var a = [] ;
for (var i = 0;i<10;i++){
a[i] = function(){
console.log(i);
};
}
a[6]();
输出结果为:10。这说明var声明的是全局变量,在代码块之外也是有效的,也就是说:被var声明的变量,全局都是有效的,所以上面代码不管你输入ai,i的值是多少,结果都会输出最后一轮输出的i值,也就是10。
let
var a = [] ;
for (let i = 0;i<10;i++){
a[i] = function(){
console.log(i);
};
}
a[6]();
输出结果为:6。这是因为let的作用域只是在代码块内才有效,出了代码块后就无效了,也就是说在for(let i = 0;i<10;i++)内部有效,所以每一次循环的i其实都是一个新的变量,,于是最后输出结果为6。那么你可能会问,为什么不是0,按照你说的每一轮循环都是一个新的变量,那么新变量的初始值应该是0吧,它输出结果6,那么是怎么知道上一轮循环的结果从而计算出本轮的结果的呢?这是因为JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就按照上一轮循环的基础上进行计算
另外还有一点也可以证明let的作用域仅是在它的作用域内,这是一个for循环:
for(let i = 0;i < 3; i++){
let i = 'abc';
console.log(i);
}
//abc
//abc
//abc
输出结果为3个abc。因为设置循环变量的那一部分,也就是for(..这里..)是一个父作用域,而for循环内部又是一个单独的子作用域。这表明了函数内部的变量i与循环变量i不在同一个作用域,而是有各自单独的作用域。