为了账号安全,请及时绑定邮箱和手机立即绑定

学习ES6时let用于for循环时,函数里console的问题

学习ES6时let用于for循环时,函数里console的问题

GCT1015 2018-09-11 12:32:17
 var a = [];    for (let i = 0; i < 10; i++) {       a[i] = function () {        console.log(i);       };     }     a[6](); //6     console.log(a[6]); //  function(){console.log(i)}既然循环结束后,数组a的每一项都是function(){console.log(i)},那么a[6]()输出是6是怎么实现的?难道let保存了10个状态?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

> console.log(i);  //10ReferenceError: i is not defined

let是块作用域声明,出了for循环就失效了~


a[6](); //6
for (let i = 0; i < 10; i++) {
  a[i] = function () {    console.log(i);
  };
}

在匿名函数作用域中log(i)引用了上层作用域的变量 i,构成闭包
a[i]中保存了10个闭包,各自保留了构成闭包时变量 i的值。


2个闭包栗子~

> var f=function(){

...  let i=0;

...  return function(){

.....  i=i+1

.....  return i

.....  }}()

undefined

> f()

1

> f()

2

> f()

3

> f()

4

> f()

5

> var fn;

undefined

> for(let i=-1;i<0;i++){

...     fn=function(){

.....         i=i+1

.....         return i

.....     }

... }

[Function]

> fn()

0

> fn()

1

> fn()

2

> fn()

3

>


查看完整回答
反对 回复 2018-10-29
  • 1 回答
  • 0 关注
  • 611 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号