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

听了几遍,我也还是不能理解为什么i都是3?

为什么是变量提升(把变量的声明提到所在作用域的最顶端)就使得结果i*2都是等于6呢?

正在回答

4 回答

https://img1.sycdn.imooc.com//5cd44f320001ad9303690288.jpg

打印结果:

https://img1.sycdn.imooc.com//5cd44f4800013dd202390136.jpg

当调用callbacks[0]()时,先执行for循环,直到i=3时执行结束后,再向callbacks函数传入i,执行callbacks[3],循环三次。

所以这种情况 callbacks[i] ===callbacks[3]

https://img1.sycdn.imooc.com//5cd4509b0001bd1d04330099.jpg

注意:这里的index不是i,而是console.table({})中的数组下标


3 回复 有任何疑惑可以回复我~
#1

Irma_C 提问者

还是不懂,那为什么callbacks函数是循环条件不满足之后才执行呢,且还循环执行3次?为什么不是每次进入循环就接着执行?
2019-05-13 回复 有任何疑惑可以回复我~
#2

慕圣3317083 回复 Irma_C 提问者

这里是我说错了,重新说一下我的理解。
2019-05-14 回复 有任何疑惑可以回复我~
#3

慕圣3317083 回复 Irma_C 提问者

我回去再看了一遍,发现运行方式确实是我说的那样,至于为什么,我对闭包函数也没怎么了解,无法解释。 如果你想清楚知道为什么这样执行,可以去深入了解闭包函数。
2019-05-14 回复 有任何疑惑可以回复我~
#4

Irma_C 提问者 回复 慕圣3317083

哦,好的,谢谢你
2019-05-14 回复 有任何疑惑可以回复我~
查看1条回复
  1. 你的理解是错的,这个跟闭包没关系,闭包只是能访问外部函数的变量i而已。

  2. 首先要理解该问题要明白js是从上至下执行的;

  3. 在代码从上至下执行到for循环的时候执行了3次,每次i加一,但是循环体内只是把数组callbacks[i]赋值了一个函数(function),但是该函数并没有执行,此时如果出入callbacks[i]得到的都是function的字符串;所以此时并没有执行function里面的console.log输出i的值。

  4. 在代码的最后一句console.table()中写的是:callbacks[0](),这句代码的意思就是执行了callbacks[0]指向的function,这时候才会执行function的内容而不是返回字符串;


  5. https://img1.sycdn.imooc.com//5d60e84a0001cc6125601378.jpg


2 回复 有任何疑惑可以回复我~
#1

细雨骑驴入剑门

应该就是这个原因,console的时候是for循环已经执行完成,i的值已经为3的时候才开始执行的,所以i的值为3
2020-02-17 回复 有任何疑惑可以回复我~

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures可以看下这里讲的闭包定义,感觉应该比较好理解了

1 回复 有任何疑惑可以回复我~
#1

Irma_C 提问者

好的,谢谢你的分享
2019-06-05 回复 有任何疑惑可以回复我~

因为i是全局变量,那当页面加载的时候,for循环是已经执行完成的,此时i的值就是3,那通过循环建立的callback函数的执行循序是在for循环之后的,所以function里面的i一直未三

3 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
ES6快速入门
  • 参与学习       64234    人
  • 解答问题       137    个

用最通俗、形象的方法描述ES6的强大并教会你正确的学习方法。

进入课程

听了几遍,我也还是不能理解为什么i都是3?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信