闭包

闭包的本质就是函数嵌套,就是在函数里面定义函数,
内部函数可以引用外部函数的参数和变量
参数和变量不会被垃圾回收机制给回收
闭包的用途:可以存循环的索引值、做私有变量计数器
闭包的一般写法
function aa(b){
var a = 12;
function bb(){
alert(a);
alert(b);
}
return bb;
}
var cc = aa(24);
闭包的封闭函数写法

var cc = (function(b){
var a = 12;

        function bb(){
            alert(a);
            alert(b);
        }

        return bb;
    })(24);

    cc();

闭包的用途:存循环的索引值

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>闭包存循环的索引值</title>
<style type="text/css">
li{
height: 30px;
background-color: gold;
margin-bottom: 10px;
}
</style>
<script type="text/javascript">
//闭包的用途:存循环的索引值
window.onload = function(){
var aLi = document.getElementsByTagName('li');
// alert(aLi.length);//8

        for(var i=0; i<aLi.length; i++){
            /*
            aLi[i].onclick = function(){
                alert(i);//每个li都弹出8,因为点击时循环已完毕,i最后为8
            }
            */

            (function(k){//这里的k是形参
                aLi[k].onclick = function(){
                    alert(k);//弹出每个li的索引值
                }
            })(i);//这里的i是实参
        }
    }
</script>

</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
</body>
</html>
闭包做选项卡

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>闭包做选项卡</title>
<style type="text/css">
.btns{
width: 500px;
height: 50px;
}
/选项卡的样式/
.btns input{
width: 100px;
height: 50px;
background-color: #ddd;/默认灰色/
color: #666;
border: 0px;
}
/被选中的选项卡的样式/
.btns input.cur{
background-color: gold;
}
/内容区的样式/
.contents div{
width: 500px;
height: 300px;
background-color: gold;
display: none;/默认隐藏/
line-height: 300px;
text-align: center;
}
/被选中的内容区的样式/
.contents div.active{
display: block;
}
</style>
<script type="text/javascript">
//闭包做选项卡
window.onload = function(){
var aBtn = document.getElementById('btns').getElementsByTagName('input');
var aCon = document.getElementById('contents').getElementsByTagName('div');
// alert(aCon.length);

        //循环所有的选项卡按钮
        for(var i=0; i<aBtn.length; i++){
            (function(i){
                //给每个选项卡按钮添加点击事件
                aBtn[i].onclick = function(){
                    //遍历所有选项卡按钮
                    for(var j=0; j<aBtn.length; j++){
                        //将每个选项卡按钮都设为灰色
                        aBtn[j].className = '';
                        //将每个内容区都隐藏
                        aCon[j].className = '';
                    }
                    //this代表当前点击的Button对象
                    this.className = 'cur';//当前点击的按钮为金色

                    // alert(i);//不加闭包时,不管点哪个按钮,i都等于3

                    //加闭包保存了索引值才有效
                    aCon[i].className = 'active';//当前点击的按钮对应的内容显示
                }
            })(i);
        }
    }
</script>

</head>
<body>
<div class="btns" id="btns">
<input type="button" value="tab01" class="cur">
<input type="button" value="tab02">
<input type="button" value="tab03">
</div>
<div class="contents" id="contents">
<div class="active">tab文字内容一</div>
<div>tab文字内容二</div>

</div>
</body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2016.9.1 第5章 闭包 5.1 闭包是如何工作的 闭包是一个函数在创建时允许该自身函数访问并操作该自身函数...
    如201608阅读 575评论 0 0
  • 卡尔维诺中文站留言板这个帖子专门用作卡尔维诺中文站的留言板,欢迎大家留言和提问。...阮一峰2007-01-04T...
    舟渔行舟阅读 339评论 0 1
  • 一、创建对象1、单体创建对象 2、工厂模式创建对象 function Person(name,age,job){/...
    小袋鼠cf阅读 78评论 0 0
  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 981评论 0 0
  • 多重条件判断语句 if语句 语法: if...else if...else当该语句执行时,会从上到下依次对条件表达...
    咻咻咻滴赵大妞阅读 994评论 0 1