老师有个问题

来源:2-9 编程练习

weixin_慕标4228902

2019-08-14 18:34:31

<!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回答

好帮手慕夭夭

2019-08-15

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

http://img.mukewang.com/climg/5d551b3e0001505d06820412.jpg

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

祝学习愉快,望采纳。

0
heixin_慕标4228902
h 明白了,感谢老师悉心讲解
h019-08-15
共1条回复

好帮手慕夭夭

2019-08-15

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

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

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

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

祝学习愉快,望采纳。

0
heixin_慕标4228902
h 老师那最普通的闭包,就是最基本两个函数嵌套那种,子函数不是给外部函数绑定事件的那种闭包,局部变量是怎么被保存下来的啊?
h019-08-15
共1条回复

好帮手慕夭夭

2019-08-14

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

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

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

http://img.mukewang.com/climg/5d53eb640001e0be05030660.jpg

祝学习愉快,望采纳。

0
heixin_慕标4228902
h 老师我这块理解的还是不好,这里用到闭包的局部变量被保存下来,在这里是不是指匿名函数里的事件函数被保存了下来啊? 还有您说这里利用的正是事件是给页面中的元素使用的,没有办法销毁和函数里的子函数被函数外部一直使用,这是什么意思啊?是被谁使用啊,是那个全局变量i吗?
h019-08-15
共1条回复

0 学习 · 14456 问题

查看课程