饥人谷技术博客

# 闭包、定时器

2016-09-26  本文已影响0人  成熟稳重的李先生

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

2.setTimeout 0 有什么作用

3.下面的代码输出多少?修改代码让fnArri 输出 i。

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

var Car = (function(){
    var i = 0;
    function setSpeed(n){
        i = n ;
    };
    function getSpeed(){
        return i;
    };
    function accelerate(){
        i = i + 10;
    };
    function decelerate(){
        i = i - 10;
    };
    function getStatus(){
        if(i > 0){
            console.log('running');
        }else{
            console.log('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.getSpeed(); //20
   Car.getStatus(); // 'running';
   Car.decelerate();
   Car.getStatus(); //'stop';
   Car.speed; //error

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

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

6.写一个函数,计算setTimeout最小时间粒度

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

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

    var a = 1;
    setTimeout(function(){ 
            a = 2; 
            console.log(a);//2,setTime优先级较低,因此放在最后执行
    }, 0);
    var a ;
    console.log(a);//输出1,变量提升,但赋值操作在其后执行。
    a = 3;
    console.log(a);//输出3,a = 3覆盖了a = 1。

所以输出顺序为1.3.2

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

   var flag = true;
   setTimeout(function(){ 
   flag = false;},0)//优先级低于‘while’。
   while(flag){}
   console.log(flag);//不会输出,上条语句判断条件一直为true,无限循环,因此不会执行到这一行。

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

方法一:

for(var i=0;i<10;i++){ 
(function(){ 
function arg(i){ 
console.log('delayer:' + i ); 
} 
return arg(i); 
})();
 }

方法二:

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

方法三:

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

方法四:

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

方法五:

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

猜你喜欢

热点阅读