任务20

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();

代码测试


任务20_第1张图片
图片标题

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

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

执行:


任务20_第2张图片
图片标题

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);
}

输出:


任务20_第3张图片
图片标题
for(var i=0;i<5;i++){
    (function(){
        var n=i;
        setTimeout(function(){
          console.log('delayer:' + n );
        }, 0);
})()
    console.log(i);
}

结果:


任务20_第4张图片
图片标题

你可能感兴趣的:(任务20)