let
1.let 类似于var ,用于声明变量,但是和var不同的是let声明的变量只能在let命令所在的代码块内有效,例:
{let a=10; var b=11; } a//ReferenceError:a is not defined b//1
上述代码显示let声明的变量在代码块外无法访问
2.for循环中let和var有截然不同的表现:
1 for(var i=0;i<3;i++){ 2 3 }; 4 console.log(i)//3 5 6 7 for(let i=0;i<3;i++){ 8 9 }; 10 console.log(i)//ReferenceError:i is not defined
var 声明的变量是全局变量,在循环外依然可以访问到,let声明的变量只能在循环内访问到,以前的for循环就会带来一些问题例如:
var a = []; for (var i = 0; i < 3; i++) { a[i] = function () { console.log(i); } } a[0]() //3 a[1]() //3 a[2]() //3
var声明的变量是全局变量,a的每一项引用的都是全局中的i,并不是确切的值,当循环结束后i变成了3,所以a的每一项输出的都是3
解决这个问题最简便的方法是将var 变成let:
var a = []; for (let i = 0; i < 3; i++) { a[i] = function () { console.log(i); } } a[0]() //0 a[1]() //1 a[2]() //2
let声明的变量只在块级作用域里有效,相当于每次循环的i都是新变量,只保存所在循环的值,置于为什么每轮循环的i是按顺序赋值的,是因为js引擎会记住上次循环的值,初始化本轮循环时就已经进行了计算
还有for循环设置变量的那一部分是一个父作用域,循环内部是一个单独的子作用域
for(let i=0;i<3;i++){ let i="abc"; console.log(i); } //abc //abc //abc