不理解

不理解


https://img1.sycdn.imooc.com//climg/62ccfbe409d4e67124421212.jpg

不理解上面讲解部分提到的当点击0号(1号,2号)按钮,作用域里没有i,当点击btn[i]的时候触发函数作用域并执行function函数,输出console.log(i),如果点击的是0号按钮 ,就是点击btn[0],此时i就是0,执行函数输出的console.log(i) 就等于0,同样点击1号按钮函数域 输出1,点击2函数域输出2 ,为什么课程里讲对应函数作用域里没有i,console.log(i) 不就是函数作用域里的吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小李 2022-07-12 13:14:32

同学你好,老师这里讲的i是不受函数作用域的影响的,因为使用var声明的i这里是在全局作用域下声明的。那么也就是说还没等点击的时候,i已经等于3了。那么这里为什么不受函数作用域的影响,是因为函数作用域调用的时候才会有作用域。

祝学习愉快!

  • 提问者 慕移动4506339 #1
    老师,明白函数作用域调用的时候才会有调用域,那当点击0号(1号,2号)按钮的时候会调用函数吗?如果会调用的话,此时它应该是有函数作用域的啊


    2022-07-12 13:51:34
  • 好帮手慕小李 回复 提问者 慕移动4506339 #2

    同学你好,这里确实有些不好让人理解,其实在点击之前循环就已经走完了。那么走完了以后i就是3了。这个时候在触发点击事件,打印出来的i就是已经走完了的3。而不是当前作用域中的同学理解的那个数字,这里其实不需要纠结,在let声明的i中就会产生作用域了。

    另外在之前的课程中有讲到封闭空间。如下:

    https://img1.sycdn.imooc.com//climg/62cd0fda099158a006910350.jpg

    https://img1.sycdn.imooc.com//climg/62cd0fbb09d1a9d507240226.jpg

    同学尝试用封闭空间的思路,也就是匿名函数自执行的思路去理解。上面例子中使用()()封闭空间自执行那么也就是说在for循环的时候,i传递进入了匿名函数后匿名函数自执行了,这个时候i就有了匿名函数的作用域。所以点击时就会打印出对应的下标。

    那么我们尝试在for循环外部打印i看看结果:

    https://img1.sycdn.imooc.com//climg/62cd107b092621c409450523.jpg

    https://img1.sycdn.imooc.com//climg/62cd108409d1a72004540176.jpg

    这里会发现,没有点击的时候i已经走完了。

    那么本章节中使用let声明我们对比一下看看在for循环外部的i是什么结果:

    https://img1.sycdn.imooc.com//climg/62cd10e70985f75908740479.jpg

    https://img1.sycdn.imooc.com//climg/62cd10ee09303be906100189.jpg

    那么使用let声明的i只能在for循环内部使用,在外部会报错未定义。这是因为let声明时i作用域就已经被明确了。

    同学尝试理解一下,祝学习愉快!

    2022-07-12 14:13:26
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师