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

这个变量i,有点不太懂

这个变量i,有点不太懂

喵喵时光机 2018-12-10 17:15:43
for (let i = 0; i < 5; i++) {            a[i] = function() {                console.log(i)            }        }        a[2]() //2i为什么不是undefined,for循环里面我只是创建了一个函数,为什么我执行a[2]的时候还是能拿到i的值
查看完整描述

1 回答

?
手掌心

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

因为let具有块级作用域的特性,因此i只会在当前循环有效。
实际上你的循环创建了5个块级作用域,每一个i值都只在当前的块级作用域中有效果。

你的代码等同于如下:

"use strict";


var _loop = function _loop(i) {

    a[i] = function () {

        console.log(i);

    };

};


for (var i = 0; i < 5; i++) {

    _loop(i);

}


a[2]();

这里就很容易能看出:
实际上let的存在让每一个i值都保存在了一个闭包中。因此这个循环创建了5个闭包。
而a数组里则保存了一堆函数,每一个函数都访问了对应的闭包中的i值。

所以i的值肯定是存在的而不undefined。

当你看不懂ES6语法相关的代码时,可以利用babel的在线工具将ES6的例子转换成ES5的代码。 在线地址


查看完整回答
反对 回复 2019-01-03
  • 1 回答
  • 0 关注
  • 444 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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