老师有个问题
<!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都变成形参存起来了,然后函数调用的时候,往上查找,就是储存的值嘛。这感觉也没用到什么闭包访问函数私有变量啊什么的这些特性啊?
正在回答
你好同学,你说的是课程中讲的吗,如下
a调用返回的是它里面的函数b,即全局变量c赋值为b函数。全局变量在js运行过程中,都会在内存中保存,所以它使用到的值,即函数b就不会被销毁。那么b所在的作用域就保存下来了。所以a函数里面定义的局部变量i也就不会被销毁了。这个与本题是一样的,只不过一个是被全局变量c使用所以能够保存,一个是被页面中的元素li使用会被保存哦。
祝学习愉快,望采纳。
你好同学,跟着老师的如下的讲解再顺一下思路:
1.首先函数嵌套函数,所以里面的函数就是子函数。在本代码中,匿名函数里面的事件就是子函数。
2.利用的正是事件是给页面中的元素使用的,没有办法销毁和函数里的子函数被函数外部一直使用,这两句话是一个意思,后者是前者的总结。子函数(事件)给元素li绑定,不是给i变量绑定,所以子函数(事件)是被元素使用的,无法释放(事件被保存下来了),那么它所在的作用域(匿名函数)就被保存下来了哦。
就像上次截图中,内存中保存了3个不同作用域,这样点击事件触发的时候,拿到的n值就是它们自己当前作用域下面保存的n值了。
祝学习愉快,望采纳。
你好同学,这里不仅用到了函数嵌套函数的格式,还用到了一个闭包作用重要的知识点,就是局部变量被保存下来了。函数在执行完毕之后,本应该被销毁的。像代码中加入有3个li, 那么循环3次,会形成3个局部作用域,也就是如下形式的:
如果按照正常来讲,这3个匿名函数在给li绑定完事件之后就应该销毁了。但是匿名函数销毁,它里面的事件也是会被销毁,那么点击li的时候就没有点击事件了。所以这里利用的正是事件是给页面中的元素使用的,没有办法销毁。
即函数里的子函数被函数外部一直使用,使子函数无法释放,保持其所在作用域,形成一个封闭的作用域,称之位闭包。事件不能销毁,那包裹它的匿名函数也就没有办法销毁,所以每一个匿名函数的参数n也就保存下来了,这样点击li的时候,可以拿到自己当前作用域下面的n值哦。
祝学习愉快,望采纳。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星