闭包、定时器

作者: 块垒 | 来源:发表于2016-08-21 10:47 被阅读38次

    什么是闭包? 有什么作用

    闭包:在一个函数中return出另外一个函数,父函数里的一些局部变量在子函数中被使用而不被释放,就是闭包。
    作用:闭包就是一个独立的数据空间

    setTimeout 0 有什么作用

    setTimeout是一个延时函数,当设定延迟的时间为0时,会使setTimeout内部的函数在所有要执行的js语句执行完成之后再执行。

    console.log(1);;
    setTimeout(function(){
      console.log(2);
    },0)
    console.log(3);
    
    setTimeout 0的作用

    代码

    • 下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法
       var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                return i;
            };
        }
        console.log( fnArr[3]() );  //10
    

    1.立即执行函数传参

    var fnArr = [];
    for(var i=0;i<10;i++){
      (function(n){
        fnArr[i]=function(){
          return n;
        }
      })(i)
    }
    console.log( fnArr[3]() );  //10
    

    2.立即执行函数,临时变量保存变量

    var fnArr = [];
    for(var i=0;i<10;i++){
      (function(){
        var n=i;
        fnArr[i]=function(){
          return n;
        }
      })()
    }
    

    3.函数内部返回函数,传参

    var fnArr = [];
    for(var i=0;i<10;i++){
      fnArr[i]=(function(n){
        return function(){
          return n;
        }
      })(i)
    }
    

    4.函数内部返回函数,临时变量保存参数

    var fnArr = [];
    for(var i=0;i<10;i++){
      fnArr[i]=(function(){
        var n=i;
        return function(){
          return n;
        }
      })()
    }
    

    使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态

    var Car = //todo;
    Car.setSpeed(30);
    Car.getSpeed(); //30
    Car.accelerate();
    Car.getSpeed(); //40;
    Car.decelerate();
    Car.decelerate();
    Car.getSpeed(); //20
    Car.getStatus(); // 'running';
    Car.decelerate(); 
    Car.decelerate();
    Car.getStatus();  //'stop';
    //Car.speed;  //error
    
    var Car = (function(){
      var speed=0;
      function setSpeed(n){
        speed=n;
      }
      function getSpeed(){
        console.log(speed);
      }
      function accelerate(){
        speed+=10;
      }
      function decelerate(){
        speed-=10;
      }
      function getStatus(){
        if(speed>0){
          console.log('running');
        }else{
          console.log('stop');
        }
      }
      return {
        setSpeed:setSpeed,
        getSpeed:getSpeed,
        accelerate:accelerate,
        decelerate:decelerate,
        getStatus:getStatus
      };
    })();
    
    • 写一个函数使用setTimeout模拟setInterval的功能
    var i=0;
    function intv(){
      setTimeout(function(){
        console.log(++i);
        intv();
      },1000)
    }
    
    • 写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
    function getMini(){
      var i=0;
      var start=Date.now();
      var clock=setTimeout(function(){
        i++;
        if(i===1000){
          var end=Date.now();
          console.log((end-start)/i);
          clearTimeout(clock);
        }
        clock=setTimeout(arguments.callee,0);
      },0);
    }
    
    • 下面这段代码输出结果是? 为什么?
    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);
    }, 0);
    var a ;
    console.log(a);
    a = 3;
    console.log(a);
    //1 3 2  setTimeout 0 使内部函数延迟执行,放在所有函数的最后面
    
    • 下面这段代码输出结果是? 为什么?
    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    //死循环,setTimeout使内部函数在所有的函数队尾执行,flag一直为真,所以死循环 
    
    • 下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)
    for(var i=0;i<5;i++){
        setTimeout(function(){
             console.log('delayer:' + i );
        }, 0);
        console.log(i);
    }
    //输出0,1,2,3,4 五个delayer:5
    
    for(var i=0;i<5;i++){
        setTimeout((function(n){
             console.log('delayer:' + i );
        })(i), 0);
        console.log(i);
    }
    

    本文版权归本人和饥人谷所有,转载请注明来源。

    相关文章

      网友评论

        本文标题:闭包、定时器

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