var和let 以及js作用域问题

今天学习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

}
发布了9 篇原创文章 · 获赞 0 · 访问量 3317

猜你喜欢

转载自blog.csdn.net/qq_27568213/article/details/80620010