闭包

一、闭包

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.延伸变量的作用范围

 

posted @ 2019-11-26 17:54  平凡人的普通修仙之路  阅读(171)  评论(0编辑  收藏  举报