任务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

    问题 1.什么是闭包? 有什么作用?闭包的含义: 在一个函数中(父函数)return出另一个函数(子函数),该子函...

  • 任务20

    什么是闭包?有什么作用? MDN:闭包(closure)是指那些能够访问独立变量的函数(变量在本地使用,但定义在一...

  • 任务20

    派送成功,点击这里立即开始! 友情提示:本兼职信息《已通过正规部门审核,公司正规合法,请应聘者放心应聘》 本公司兼...

  • 任务20

    1.什么是闭包?有什么作用? 闭包就是:在函数a中声明另一个函数b然后返回b,当函数a的内部函数b被函数a外的一个...

  • 一阶Day 7作业

    Day 7: 平板支撑左右碰地20个+俯卧登山跑20个 经期任务: 左右触脚踝20个+原地小跑20个 完成任务后,...

  • Day05 效率清单 | 忙而不忘

    在之前的课程中,任务分成了两大块:20%关键任务和80%常规任务。 一个项目成功与否关键在于那关键的20%任务,因...

  • 20 国际任务(下)

    国际任务International Assignment(下) - 维也纳国宝蛋糕 临近国际任务结束的一个周末,我...

  • 30天减脂挑战赛D20训练任务

    D20训练任务 D20饮食建议

  • 26店3月(15-31)目标分解

    一组:娜娜 西西 任务件数270件20万 二组:媛媛 欢欢 任务件数270件20万 三组:谷娇 丽姐 任务件数27...

  • 20

    任务20,接下来的每天任务保底20,然后根据自己能力多完成,差点完不成任务,不知怎么的今天好几个高质量的没有添...

网友评论

      本文标题:任务20

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