美文网首页
十四、JavaScript之——闭包

十四、JavaScript之——闭包

作者: 风中丶凌乱 | 来源:发表于2018-09-18 22:17 被阅读0次

    变量的作用域
    全局变量:函数外部定义的变量,函数内部和外部都可以访问,它的值可以共享

    局部变量:函数内部定义的变量,函数内部可以访问,外部无法访问。函数内部访问变量时,先在内部查找是否有此变量,如果有,就使用内部变量,如果没有,就去外部查找

    函数内部如果不用'var'关键字定义变量,变量可能会变成全局变量,如果用严格模式解析会报错

    封闭函数
    原来的写法

      function myAlert(){
          var str = '欢迎访问我的主页';
          alert(str);
      }
    
      myAlert();*/
    封闭函数的一般写法
    
      var str = function(){
          alert('test');
      }
    

    封闭函数定义:(function(){……})()

      ;;(function(){
          var str = '欢迎访问我的主页';
          alert(str);
      })();//最后的()表示马上执行
    

    封闭函数其他的写法:在匿名函数前加“!”或者“~”,之后加“()”

       ~function(){
            var str = '欢迎访问我的主页';
            alert(str);
        }();
    

    用变量的方式定义函数
    原来的写法:可以提前

      myAlert();
      function myAlert(){
          alert('hello!');
      }*/
    

    函数用变量方式定义:先定义再使用

       myalert();//提前会报错
      var myAlert = function(){
          alert('hello!');
      }
    

    myAlert();//放在下面可以执行

    闭包

    本质就是函数嵌套,就是在函数里面定义函数,
    内部函数可以引用外部函数的参数和变量
    参数和变量不会被垃圾回收机制给回收
    闭包的用途:可以存循环的索引值、做私有变量计数器

    闭包的一般写法

      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();
    

    只能调用一次的闭包

      (function(b){
          var a = 12;
    
          function bb(){
              alert(a);
              alert(b);
          }
    
          return bb;
      })(24)();
    

    闭包的功能实现

    1. 闭包存循环的索引值

    <!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)
                   }*/
    
                    (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>
    

    2. 闭包做私有变量计数器

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>闭包做私有变量计数器</title>
        <!--<style type="text/css">-->
            <!---->
        <!--</style>-->
    
        <script type="text/javascript">
            //闭包的用途:私有变量计数器
            var count = (function () {
                var a = 0;
    
                function bb() {
                    a++;
                    return a;
                }
                return bb;
            })();
    
            //每调用一次count,a就增加一次
        </script>
    </head>
    <body>
    <ul>
    
    </ul>
    </body>
    </html>
    

    3. 闭包做选项卡

    <!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>tab文字内容三</div>
        </div>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:十四、JavaScript之——闭包

          本文链接:https://www.haomeiwen.com/subject/neimnftx.html