以下所写都是个人的理解,可能会有不正确的地方。
1.let和var的区别
var a= []; for (let i = 0; i <10; i++) { a[i]=function(){ console.log(i); }; }
console.log(i); //i is not defined
let声明的变量在循环体外是不可访问的,是个局部变量。
var a= []; for (var i = 0; i <10; i++) { a[i]=function(){ console.log(i); }; } console.log(i); //10
var声明的变量是个全局变量,所以循环体外可以访问,值为循环结束后的值:10。
var a= []; for (var i = 0; i <10; i++) { a[i]=function(){ console.log(i); }; } //i = 10; a[8]() ; //10
i=111;
a[8](); //111
var声明的变量,在全局范围内有效,循环结束后i=10,
调用a[8](),实际上是执行函数 function(){console.log(i)};自然结果为10;
当人为改变i=111后,调用a[8](),继续执行console.log(i);结果自然为111.
var a= []; for (let i = 0; i <10; i++) { a[i]=function(){ console.log(i); }; } a[8]() ; //8
i=10;
a[8](); //8
而用let声明的变量,在循环体外是不能访问的,那么
这里的a[8](),执行的就不是 function(){console.log(i)}了,因为在循环体外是找不到这个i的,所以
这里的a[8](),执行的是 function(){console.log(8)},就算人为给它一个i=10,执行的还是console.log(8)。
总结的话:
let声明变量时,若let变量存在于循环体内,那么在多次循环之间这个let变量值是互不影响的;
var声明的变量由于是全局变量,多次循环是会改变它的值的,当调用时,永远是调用这唯一一个变量的最终值。