原生js开发tab选项卡之闭包

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生JavaScript封装选项卡插件</title>
    <style>
        * {margin: 0; padding: 0; font-family: "\5FAE\8F6F\96C5\9ED1",
        Helvetica, sans-serif; font-size: 14px;-webkit-user-select: none;}
        ul,li{list-style:none; }
        .box{
            width:500px;margin:20px auto;
        }
        .box ul{
            position:relative;
            top:1px;
        }
        .box ul:after{
            content:"";
            display:block;
            clear:both;
        }
        .box ul li{
            float:left;
            margin-right:15px;
            width:100px;
            height:30px;
            border:1px solid green;
            text-align:center;
            cursor:pointer;
        }
        .box ul li.selected{
            background:lightblue;
            border-bottom-color:lightblue
        }
        .box div{
            height:150px;
            line-height:150px;
            background:lightblue;
            border:1px solid green;
            text-align: center; display: none;
        }
        .box div.selected{display: block;}
    </style>
</head>
<body>
<div class="box" id="tabFir">
    <ul>
        <li class="selected">页卡一</li>
        <li>页卡二</li>
        <li>页卡三</li>
    </ul>
    <div class="selected">内容一</div>
    <div>内容二</div>
    <div>内容三</div>
</div>
</body>
<script>
    window.onload = function(){
        var tabFir = document.getElementById('tabFir'),
        oLis = tabFir.getElementsByTagName('li'),
        oDivs = tabFir.getElementsByTagName('div');

        debugger;
        for (var i = 0; i < oLis.length; i++) {
            (function (num){
                oLis[i].onclick = function(){  //这个匿名函数在匿名函数自执行的内部,这两者
                    //形成了一个闭包
                    changeTab(num);            //最外层的每个匿名函数,就算执行环境被销毁了,
                                               //但是由于changeTab(num),要引用其活动对象num
                                               //所以活动对象仍然会留在内存中。
                                                //由于在调用每个匿名函数时,我们传入了变量i.由于函数参数
                                                /*是按值传递的,所以会将变量i的当前值,复制给参数num,而这个匿名函数
                                                内部,又创建并返回num的闭包,这样一来,每个onclick回调函数都有自己
                                                num变量的一个副本。因此可以返回各自不同的数值。
                                                * */
                }
            })(i);
        }

//按值传递
        function changeTab(n) {
            for (var i = 0; i < oLis.length; i++) {
                oLis[i].className = null;
                oDivs[i].className = null;
            }
            oLis[n].className = 'selected';
            oDivs[n].className = 'selected';
        }
    }

</script>
</html>

 

posted @ 2017-12-14 14:13  千寻的天空之城  阅读(823)  评论(0编辑  收藏  举报