任务20

作者: 黄露hl | 来源:发表于2016-11-23 22:13 被阅读0次

    1.什么是闭包?有什么作用?

    闭包就是:在函数a中声明另一个函数b然后返回b,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。内部的函数b可以访问外部a中的变量。
    闭包的作用有:1、保护函数内的变量安全。2、在内存中维持一个变量。

    2.setTimeout 0 有什么作用

    setTimeout的作用是设置延时器,setTimeout 0设置了延时时间为0毫秒,其主要作用实现JavaScript异步,如:

    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);
    }, 0);
    console.log(a);
    

    这段代码的执行结果不是 2 2。
    而是 1 2。原因是JavaScript 是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。如果设置了setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。所以 setTimeout 并不能保证执行的时间,是否及时执行取决于 JavaScript 线程是拥挤还是空闲。所以设置setTimeout(0)相当于告诉浏览器尽可能快的执行。

    代码题

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

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() );  //10
    
    //.修改代码让fnArr[i]() 输出 i。第一种方法
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        (function(n){
            fnArr[i] =  function(){
            return n; }
        })(i)
    }
    //第二种方式
    console.log( fnArr[3]() ); 
        (function(){
            var n=i;
            fnArr[i] =  function(){
            return n; }
        })()
    

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

    function outerFn(){
        var speed;
        function setSpeed(n){
            return speed=n;
        }
        function getSpeed(){
            console.log(speed);
        }
        function accelerate(){
            return speed +=10;
        }
        function decelerate(){
            if(speed >=10){
                return speed -=10;
            }else{
                return speed=0;
            }
        }
        function getStatus(){
            if(speed<=0){
                console.log('stop');
            }else{
                console.log('running')
            }
        }
        return {'setSpeed':setSpeed,'getSpeed':getSpeed,'accelerate':accelerate,'decelerate':decelerate,'getStatus':getStatus};
    }
    var Car=outerFn();
    

    代码测试


    图片标题图片标题

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

    var i=0;
    function time(){
        i++;
        if(i>10){
            console.log('结束');
            return;
        }else{
            console.log(i);
            setTimeout(time,1000);
        }
    }
    

    执行:


    图片标题图片标题

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

    (function mini(){
        var i=0;
        var start=Date.now();
        var clock=setTimeout(function fn(){
            i++;
            if(i===1000){
                var end=Date.now();
                console.log((end-start)/i);
            }
            clock=setTimeout(fn,0)
        },0)
    })()
    

    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) //function被移到了最后,不能执行
    while(flag){} //代码一直卡在了这里
    console.log(flag);未执行
    

    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(){
            var n=i;
            setTimeout(function(){
              console.log('delayer:' + n );
            }, 0);
    })()
        console.log(i);
    }
    

    结果:


    图片标题图片标题

    相关文章

      网友评论

          本文标题:任务20

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