老师有个问题

老师有个问题

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>2-1</title>

    <style>

        /*补充代码*/

    </style>

</head>

<body>

    <!-- 补充代码 -->

    <script>

        var li=document.getElementsByTagName("li");

        for(var i=0,len=li.length;i<len;i++){

            (function(n){

               // 补充代码

               li[n].onclick=function(){

                   alert(n+1);

               }

            })(i)

        }

    </script>

</body>

</html>


老师这块有个问题,这确实是个闭包,外面一个自调用函数,里面有事件处理函数,这种函数嵌套函数的不都算是闭包嘛,不过感觉这题也没用到什么之前课上讲的闭包的特性啊,这题不就是,如果不加外面的自调用函数,循环结束的时候事件处理函数还未执行,最后触发的时候直接就是i的最终值了。然后利用函数自调用,将每个实时的i都变成形参存起来了,然后函数调用的时候,往上查找,就是储存的值嘛。这感觉也没用到什么闭包访问函数私有变量啊什么的这些特性啊?

正在回答

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

3回答

你好同学,你说的是课程中讲的吗,如下

http://img1.sycdn.imooc.com//climg/5d551b3e0001505d06820412.jpg

a调用返回的是它里面的函数b,即全局变量c赋值为b函数。全局变量在js运行过程中,都会在内存中保存,所以它使用到的值,即函数b就不会被销毁。那么b所在的作用域就保存下来了。所以a函数里面定义的局部变量i也就不会被销毁了。这个与本题是一样的,只不过一个是被全局变量c使用所以能够保存,一个是被页面中的元素li使用会被保存哦。

祝学习愉快,望采纳。

好帮手慕夭夭 2019-08-15 09:47:26

你好同学,跟着老师的如下的讲解再顺一下思路:

1.首先函数嵌套函数,所以里面的函数就是子函数。在本代码中,匿名函数里面的事件就是子函数。

2.利用的正是事件是给页面中的元素使用的,没有办法销毁和函数里的子函数被函数外部一直使用,这两句话是一个意思,后者是前者的总结。子函数(事件)给元素li绑定,不是给i变量绑定,所以子函数(事件)是被元素使用的,无法释放(事件被保存下来了),那么它所在的作用域(匿名函数)就被保存下来了哦。

就像上次截图中,内存中保存了3个不同作用域,这样点击事件触发的时候,拿到的n值就是它们自己当前作用域下面保存的n值了。

祝学习愉快,望采纳。

  • 提问者 weixin_慕标4228902 #1
    老师那最普通的闭包,就是最基本两个函数嵌套那种,子函数不是给外部函数绑定事件的那种闭包,局部变量是怎么被保存下来的啊?
    2019-08-15 13:35:19
好帮手慕夭夭 2019-08-14 19:15:30

你好同学,这里不仅用到了函数嵌套函数的格式,还用到了一个闭包作用重要的知识点,就是局部变量被保存下来了。函数在执行完毕之后,本应该被销毁的。像代码中加入有3个li, 那么循环3次,会形成3个局部作用域,也就是如下形式的:

如果按照正常来讲,这3个匿名函数在给li绑定完事件之后就应该销毁了。但是匿名函数销毁,它里面的事件也是会被销毁,那么点击li的时候就没有点击事件了。所以这里利用的正是事件是给页面中的元素使用的,没有办法销毁。

即函数里的子函数被函数外部一直使用,使子函数无法释放,保持其所在作用域,形成一个封闭的作用域,称之位闭包。事件不能销毁,那包裹它的匿名函数也就没有办法销毁,所以每一个匿名函数的参数n也就保存下来了,这样点击li的时候,可以拿到自己当前作用域下面的n值哦。

http://img1.sycdn.imooc.com//climg/5d53eb640001e0be05030660.jpg

祝学习愉快,望采纳。

  • 提问者 weixin_慕标4228902 #1
    老师我这块理解的还是不好,这里用到闭包的局部变量被保存下来,在这里是不是指匿名函数里的事件函数被保存了下来啊? 还有您说这里利用的正是事件是给页面中的元素使用的,没有办法销毁和函数里的子函数被函数外部一直使用,这是什么意思啊?是被谁使用啊,是那个全局变量i吗?
    2019-08-15 09:11:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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