小白用闭包做选项卡(此文是自己做题过程,本人对于闭包理解极差,求指正!)

本次作业是利用闭包完成选项卡,

经过一系列磕磕绊绊,终于完成了,但是对闭包感觉还是有点懵逼,

故写下此文梳理自己的思路,=========》求教导!求指正!求大佬带飞!

完成版代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        div{
            display: none;
            border: 1px solid #666;
             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 取到对应的索引)

原文地址:https://www.cnblogs.com/momomiji/p/7658377.html