美文网首页
JS 闭包、定时器

JS 闭包、定时器

作者: 盖被吹空调 | 来源:发表于2016-07-21 02:06 被阅读0次

    什么是闭包? 有什么作用##

    • 闭包:简单来说就是通过在父函数中返回内部函数的方法,从外层作用域访问父函数中的变量的方法。
    • 作用:1.从外部访问函数内部的变量;2.避免函数在执行完成后被销毁,使变量驻留在内存中。

    setTimeout 0 有什么作用##

    让setTimeout中的函数排在任务队列末尾,等待其他语句全部执行完毕再开始立即执行。

    下面的代码输出多少?修改代码让fnArr[i]()输出 i。使用两种以上的方法##

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

    方法一

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

    方法二

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

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

        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;
          return{
            setSpeed:function(val){
              speed = val;
            },
            getSpeed:function(){
              return speed;
            },
            accelerate:function(){
              speed += 10;
            },
            decelerate:function(){
              speed -= 10;
            },
            getStatus:function(){
              if (speed === 0) {
                return "stop";
              }
              else if (speed > 0) {
                return "running";
              }
            }
          }
        }());
    

    写一个函数使用setTimeout模拟setInterval的功能##

    function setInterval(val) {
      setTimeout(function(){
            //todo something;
            setInterval(val);
        },val)
    }
    

    写一个函数,计算setTimeout最小时间粒度##

    function getTime() {
                var timeStar = Date.now();
                var i = 0;
                var clock = setTimeout(function(me){
                    i++;
                    if(i === 1000) {
                        clearTimeout(clock);
                        var timeEnd = Date.now();
                        console.log((timeEnd-timeStar)/i);
                    }
                    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);
    

    无输出结果,while一直循环,理由同上

    下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)##

    for(var i=0;i<5;i++){
      (function(){
        var n = i ;
        setTimeout(function(){
             console.log('delayer:' + n );
        }, 0);
      })();
        console.log(i);
    }
    

    相关文章

      网友评论

          本文标题:JS 闭包、定时器

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