zoukankan      html  css  js  c++  java
  • 闭包

    一、闭包

    1.变量作用域

    变量根据作用域的不同分为两种:全局变量和局部变量。

    1.函数内部可以使用全局变量。

    2.函数外部不可以使用局部变量。

    3.当函数执行完毕,本作用域内的局部变量会销毁。

    二、什么是闭包

    闭包:指有权访问另一个函数作用域中变量的函数。------JavaScript高级程序设计

    简单理解就是:一个作用域可以访问另外一个函数内部的局部变量。

    闭包的作用:延伸了变量的作用范围

    function fn(){

        var num=10;

      return   function fun(){

          console.log(num);

          }

    }

    var f=fn();

     //类似于var f=function(){

           console.log(num);   

      }

      f();

    三、闭包的应用

      <ul class="nav">
            <li>榴莲</li>
            <li>臭豆腐</li>
            <li>鱼罐头</li>
            <li>大猪蹄子</li>
        </ul>
        <script>
            //闭包应用-点击li输出当前li的索引号
            //1.我们可以利用动态添加属性的方式
            var lis=document.querySelector('.nav').querySelectorAll('li');
            // for(var i=0;i<lis.length;i++){
            //     lis[i].index=i;
            //     lis[i].onclick=function(){
            //      console.log(this.index);
            //     // console.log(i);
            //    }
            // }
            //2.利用闭包的方式得到当前小li的索引
            for(var i=0;i<lis.length;i++){
                //立即执行函数也成为小闭包因为立即执行函数里面的每一个函数
                //都可以使用他这个变量
                //利用for循环创建4个立即执行函数
                (function(i){
                //console.log(i);
                   lis[i].onclick=function(){
                       console.log(i);
                   }
                })(i)
            }
        </script>
    四、闭包定时器的应用
       <ul class="nav">
                <li>榴莲</li>
                <li>臭豆腐</li>
                <li>鱼罐头</li>
                <li>大猪蹄子</li>
       </ul>
       <script>
          //闭包应用-3秒之后,打印所有li元素的内容
          var lis=document.querySelector('.nav').querySelectorAll('li');
         for(var i=0;i<lis.length;i++){
            //  setTimeout(function(){
            //      console.log(lis[i].innerHTML);
            //  },3000)
            (function(i){
                setTimeout(function(){
                        console.log(lis[i].innerHTML);
                },3000)
              })(i);
             }
       </script>
    五、闭包-计算打车价格
    <script>
          //闭包应用-计算打车价格
          //打车起步价13(3公里内),之后每多一公里增加5块钱,用户输入公里数
          //就可以计算打车价格
          //如果有拥堵情况,总价格多收取10块钱拥堵费
         var   car= (function(){
                var start =13;//起步价
                var total=0;//总价
                return {
                    //正常总价
                    price:function(n){
                        if(n<=3){
                            total=start;
                        }else{
                            total=start+(n-3)*5;
                        }
                        return total;
                    },
                    //拥堵之后的费用
                    yd:function(flag){
                      return  flag?total+10:total;
                    }
                }
            })();
          console.log(car.price(5)); //23
          console.log(car.yd(true));//33
          console.log(car.price(1)); //13
          console.log(car.yd(false));//13
        </script>
    六、闭包的思考题
    <script>
        //没有局部变量就没有闭包的产生
       var name="The Window";
       var object={
           name:"My Object",
           getNameFunc:function(){//The Window 匿名函数指向window
               return function(){
                   return this.name;
               }
           }
       };
       console.log(object.getNameFunc()());
      // var f=object.getNameFunc();
       //类似于
        //  var f=  function(){
        //                return this.name;
        //            }
        // f();
     
    浏览器输出:The Window
        //思考题2
        var name="The Window";
        var object={
            name:"My Object",
            getNameFunc:function(){
                var that=this;
                return function(){
                   return that.name;
                };
            }
        };
        console.log(object.getNameFunc()());
        //var f=object.getNameFunc();
        // var f=function(){
        //            return that.name;
        //         };
        // f();
    浏览器输出 My Object
     
    七、闭包的总结:
         1.闭包是一个函数(一个作用域可以访问另外一个函数的局部变量)
            这个变量所在的函数就是闭包。
         2.延伸变量的作用范围
  • 相关阅读:
    Java基础回顾---JVM&JDK&JRE
    学习
    学习
    学习
    进度
    进度
    毕设进度
    学习进度
    Beta阶段项目总结
    第二阶段冲刺——seven
  • 原文地址:https://www.cnblogs.com/sna-ling/p/11937335.html
Copyright © 2011-2022 走看看