这个变量i,有点不太懂

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

            a[i] = function() {

                console.log(i)

            }

        }


        a[2]() //2

i为什么不是undefined,for循环里面我只是创建了一个函数,为什么我执行a[2]的时候还是能拿到i的值

喵喵时光机
浏览 445回答 1
1回答

手掌心

因为let具有块级作用域的特性,因此i只会在当前循环有效。实际上你的循环创建了5个块级作用域,每一个i值都只在当前的块级作用域中有效果。你的代码等同于如下:"use strict";var _loop = function _loop(i) {&nbsp; &nbsp; a[i] = function () {&nbsp; &nbsp; &nbsp; &nbsp; console.log(i);&nbsp; &nbsp; };};for (var i = 0; i < 5; i++) {&nbsp; &nbsp; _loop(i);}a[2]();这里就很容易能看出:实际上let的存在让每一个i值都保存在了一个闭包中。因此这个循环创建了5个闭包。而a数组里则保存了一堆函数,每一个函数都访问了对应的闭包中的i值。所以i的值肯定是存在的而不undefined。当你看不懂ES6语法相关的代码时,可以利用babel的在线工具将ES6的例子转换成ES5的代码。&nbsp;在线地址
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript