小白用闭包做选项卡(此文是自己做题过程,本人对于闭包理解极差,求指正!)
本次作业是利用闭包完成选项卡,
经过一系列磕磕绊绊,终于完成了,但是对闭包感觉还是有点懵逼,
故写下此文梳理自己的思路,=========》求教导!求指正!求大佬带飞!
完成版代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
div{
display: none;
border: 1px solid #666;
width: 300px;
height: 300px;
}
.active{
background: yellow;
}
</style>
<script>
window.onload=function(){
function tab(){}
tab.prototype.inti=function(){
this.btns=document.querySelectorAll('input');
this.abox=document.querySelectorAll('div');
this.changTab();
}
tab.prototype.changTab=function(){
var that=this;
for(var i=0;i<this.btns.length;i++){
this.btns[i].onclick=(function(num){
return function(){
for(var j=0;j<that.btns.length;j++){
that.btns[j].className='';
that.abox[j].style.display='none';
}
this.className='active';
that.abox[num].style.display='block';
}
})(i)
}
}
var obj=new tab();
obj.inti();
}
</script>
</head>
<body>
<input type="button" value="选项卡一" class="active">
<input type="button" value="选项卡二">
<input type="button" value="选项卡三">
<div style="display: block">富强</div>
<div>民主</div>
<div>和谐</div>
</body>
</html>
对于整段代码,最关键的部分也就在闭包那一段了

就是这一部分了...
首先来自我分析...
最开始是点击事件那一部分
---------->给btns每个按钮绑定点击事件,然后对其对应的事件进行自我调用,传递参数 i
-------->至于 i 的大小,经过一系列弹窗测试,证实 i 并没有变成3,i 是点击按钮的索引(个人推测原因可能是由于函数自我调用,没有产生异步事件的原因吧)
------->由于绑定事件的自我调用,导致函数返回了一个匿名函数function,而这个匿名函数里则是对元素的一系列操作
---------->那么很明显,这个匿名函数就是需要点击按钮才能执行的函数了,就是一个异步事件
---------->既然这样,那么最后一步,也是最关键的一步,就是如何给对应点击按钮的 div 找出正确的索引了
----------->最开始时给点击事件传递了一个参数 i ,即给形参 num 传递了一个 i
----------->
可以看见,abox 通过参数 num 成功的拿到了对应的索引
------------》》》》》网上查找一些特性 -----别人的原话-----》》》》》
------------------------额。。。。经过一系列梳理,知道这个怎么使用了,但是对于其原理还是不太明白。。。。。。
(不太明白为什么点击按钮后,还能通过参数 num 取到对应的索引)
浙公网安备 33010602011771号