码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2017-12-14 14:52:43      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:size   var   ack   har   ext   值传递   meta   一个   otto   

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

 

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

标签:size   var   ack   har   ext   值传递   meta   一个   otto   

原文地址:http://www.cnblogs.com/qianxunpu/p/8037438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!