ES6之前使用var声明变量
在ES6之前,JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。
例如:
{
var i = 1;
}
console.log(i); //1
ES6新增let,可以声明块级作用域的变量
例如:
{
let i = 1;
}
console.log(i); //报错: i is not defined
let配合for循环的独特应用
JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响。
function a (){
let list = [];
for (let i = 0; i < 10; i++) {
list[i] = function log(){
console.log(i);
}
}
return list;
}
let list = a();
for(let j = 0; j < list.length; j++){
list[j]();
}
//输出结果: 0,1,2,3,4,5,6,7,8,9
如果使用var声明的话,变量会被提升为全局变量:
function a (){
let list = [];
for (var i = 0; i < 10; i++) {
list[i] = function log(){
console.log(i);
}
}
return list;
}
let list = a();
for(let j = 0; j < list.length; j++){
list[j]();
}
//输出结果: 10,10,10,10,10,10,10,10,10,10
来源:https://blog.csdn.net/weixin_44713050/article/details/99231766