今天学习ES6 的时候发现了var 和 let 之间的不同。
var a=[];
for(var i=0;i<10;i++){
a[i]=funciton(){
console.log(i);
};
}
a[6](); //10
for(var i=0;i<a.length;i++){
a[i](); //0~9的输出
}
var a=[];
for(let i=0; i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6](); //6
var设置的是全局变量。数组中存储的是指向i的内存地址,所以在循环中i一直在变化,最后在10就不动了。
let设置的是局部变量,声明的变量仅在块级作用域内有效。变量i只在本轮循环有效,所以写入数组的是本轮的i,每轮的i都是新的变量。具体可以看
http://es6.ruanyifeng.com/#docs/let
让我深感自己作用域学得不好,所以我在网上查了下js作用域的理解。
首先在函数内部的作用域是
var a=10;
function aaa(){
console.log(a);
var a=20;
}
aaa(); //undefined
这里a有函数内部作用域和外部作用域,首先根据就近原则有两个冲突的就选择自身的undefined。这是我自己的理解,如果有不对的,欢迎指正。
var a=10;
function aaa(){
cosonle.log(a);
a=20; //没有var就是全局变量
}
aaa(); //10
var a=10;
function aaa(){
var a=20; //函数内作用域
cosole.log(a); //20
}