定时器、闭包

1、修改代码让 fnArr [i] () 输出 i

   var fnArr = [];
   for (var i = 0; i < 10; i ++) {
       fnArr[i] =  function(){
           return i;
       };
   }
   console.log( fnArr[3]() );    //10,for循环结束后i的值为10

方法一:

定时器、闭包_第1张图片
立即执行函数内return匿名函数

方法二:

定时器、闭包_第2张图片
立即执行函数内创建fnArr[i]为匿名函数

方法三:

定时器、闭包_第3张图片
立即执行函数通过传参来实现闭包的效果

2、封装一个汽车对象,可以通过如下方式获取汽车状态

var Car = (function(){
   var speed = 0;
   function setSpeed(s){
       speed = s
   }
   function getSpeed(){
     return speed;
   }
   function accelerate(){     //加速10
      return speed += 10;
   }
   function decelerate(){     //减速10
     return speed -= 10;
   }
   function getStatus(){
     if(speed>0){
       return 'running';
     }else{
       return 'stop';
     }
   }
   return {
      'setSpeed': setSpeed,
      'getSpeed': getSpeed,
      'accelerate': accelerate,
      'decelerate': decelerate,
      'getStatus': getStatus
   }
})()
Car.setSpeed(30);  
console.log(Car.getSpeed())  //30
Car.accelerate();
console.log(Car.getSpeed())   //40
Car.decelerate();
Car.decelerate();
console.log(Car.getSpeed())    //20
console.log(Car.getStatus())  // 'running';
Car.decelerate(); 
Car.decelerate();
console.log(Car.getStatus())   //'stop';
定时器、闭包_第4张图片
闭包封装

3、下面这段代码输出结果是? 为什么?

var a = 1;
setTimeout(function(){           //setTimeout()函数,最后执行
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);

输出结果:1、3、2;执行循序总延时函数放在最后

4、下面这段代码输出结果是? 为什么?

var flag = true;
setTimeout(function(){           //延时函数最后执行
    flag = false;
},0)
while(flag){}
console.log(flag);

不输出任何结果,在while(flag){}中进入死循环(flag一直为true)

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

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

输出:


定时器、闭包_第5张图片
image.png
定时器、闭包_第6张图片
闭包实现

6、如何获取元素的真实宽高

getComputedStyle(ele)['height']       //获取当前元素最终CSS样式的高
getComputedStyle(ele)['width']        //获取当前元素最终CSS样式的宽

7、 URL 如何编码解码?为什么要编码?

JavaScript提供四个URL的编码/解码方法。
编码: encodeURI()、 encodeURIComponent()
解码: decodeURI()、decodeURIComponent()

为什么要编码:对于不同的操作系统、不同的浏览器、不同的网页字符集采用的是不同的编码,也将导致完全不同的编码结果。但是我们可以使用Javascript先对URL编码,然后再向服务器提交,不给浏览器编码的机会,从而保证服务器得到的数据是格式统一。
区别:
encodeURI方法不会对下列字符编码:

  • ASCII字母
  • 数字
  • ~!@#$&*()=:/,;?+'

encodeURIComponent方法不会对下列字符编码

  • ASCII字母
  • 数字
  • ~!*()'

可以看出encodeURIComponent比encodeURI 编码的范围更大。

8、补全如下函数,判断用户的浏览器类型

function isAndroid(){
  return /Android/.test(navigator.userAgent);
}
funcnction isIphone(){
  return /iphone/.test(navigator.userAgent)
}
function isIpad(){
  return /ipad/.test(navigator.userAgent)
}
function isIOS(){
  return /(ipad)|(iphpne)/.test(navigator.userAgent)
}

你可能感兴趣的:(定时器、闭包)