任务20

2016-11-29  本文已影响22人  璐璐熙可

问题

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

(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时,有如下作用:

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);
     }
上一篇下一篇

猜你喜欢

热点阅读