任务20

作者: 璐璐熙可 | 来源:发表于2016-11-29 19:01 被阅读22次

    问题

    1.什么是闭包? 有什么作用?
    闭包的含义:

    • 在一个函数中(父函数)return出另一个函数(子函数),该子函数访问了父函数中的局部变量,使父函数里面的内存不能被释放。这就生成了一个闭包。下面这段代码就是典型的闭包:
    (function (){
        function deal(){
            var a=1;
            function inc(){
                console.log(++a);
            }
            return inc;
        }
        var inc=deal();
        inc();
        inc();
    }())
    

    输出结果为2和3;

    作用:

    • 可维持一个独立的数据空间;下次在用时,这个内存不用释放,就可通过暴露出的这个函数去操作这些变量,让它发生一些改变。

    2.setTimeout 0 有什么作用?
    setTimeout(function(){},ms) setTimeout传入了两个参数,第一个参数是所需要实现的功能函数;第二个参数为延迟的毫秒数;setTimeout是一个延时函数,当设定延迟的时间为0时,有如下作用:

    • 会使setTimeout内部的函数在其他代码执行完后再去执行.
    console.log(4);
        setTimeout(function () {
            console.log(2);
        },0);
    console.log(7);
    

    输出结果为:



    上述例子中console.log(2)是最后执行的.

    代码题

    1.下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() );  //输出结果为10,,因为函数执行之前i=10;在for循环中i的值并没有随着循环保存在函数中,所以我们需要用闭包的方式来保存i的值;
    

    方法一:

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

    方法二:

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

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

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

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

    var i=0;
     (function Count(){
       i +=1;
       setTimeout(Count,1000);
       })();
     console.log(i);
    

    4.写一个函数,计算setTimeout平均[备注:新加]最小时间粒度

    function getMini(){
        var i=0;
        var start=Date.now();
        var timer=setTimeout(function (){
        i++;
        if (i==1000){
            var end=Date.now();
            clearTimeout(timer);
            console.log((end-start)/i);
         }                  
        timer=setTimeout(arguments.callee,1);
        },1);
    }
    getMini(); 
    

    5.下面这段代码输出结果是? 为什么?

    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会把当前函数放到最后执行

    6.下面这段代码输出结果是? 为什么?

    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    

    while方法会无限循环,无任何输出。setTimeout函数会把指定的任务放在最后执行,变量flag一直为true,所以while方法会无限循环。

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

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

    方法一:

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

    方法二:

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

    相关文章

      网友评论

          本文标题:任务20

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