闭包 定时器 BOM

1. 下面的代码输出多少?修改代码让 fnArri 输出 i。使用 两种以上的方法

var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr3 ); //

  • 方法一
var fnArr=[]
        for(var i=0;i<10;i++){
            fnArr[i]=(function(j){
                return function(){
                    return j
                }
            })(i)
        }
        console.log(fnArr[4]()) //4 
  • 方法二
var fnArr=[]
        for (var i=0;i<10;i++){
            !function(i){
                fnArr[i]=function(){
                    return i
                }
            }(i)
        }
        console.log(fnArr[5]())//5

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

var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
...
return {
setSpeed: setSpeed,
...
}
})()
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(s){
               speed = s
               return speed
            }
            function getSpeed(){
                return speed
            }
            function decelerate(){
                speed-=10
                return speed
            }
            function accelerate(){
                speed+=10
                return speed
            }
            function getStatus(){
                if (speed>0){
                    return 'running'
                }
                else{
                    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';
        //Car.speed;  //error

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

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.也会在整个代码执行完成之后再执行

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

var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
       while(flag){}
           console.log(flag);
    //没有任何输出
    //setTimeout会在整个代码执行完毕之后再执行,
     但是由于flag始终为true,
     while函数会一直执行下去,
      所以setTimeout不会执行

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

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

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

var teat= document.querySelector(".test")
getComputedStyle(test,pse).width  //获取元素的宽度,第二鸽参数为伪类,没有则不设置
getComputedStyle(test,pse).height //获取元素的宽度,第二鸽参数为伪类,没有则不设置

//兼容低版本IE的方式
function tureStyle(element,pse){
    return element.currentStyle ?
    element.currentStyle:window.getComputedStyle(element,pse);
}
var trueWidth=tureStyle(element,pse).width
var trueHeight=tureStyle(element,pse).height

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

  • 编码方式:
    encodeURI()
    encodeURIComponent()

  • 区别:
    encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&*()=:/,;?+'
    encodeURIComponent方法不会对下列字符编码ASCII字母、数字、~!*()'
    所以encodeURIComponentencodeURI编码的范围更大。

  • 解码方式:
    decodeURI()
    decodeURIComponent()

  • 编码原因:

对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。

比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了歧义。

又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。

URL编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符.

预备知识:URI是统一资源标识的意思,通常我们所说的URL只是URI的一种。下面提到的URL编码,实际上应该指的是URI编码。

参考

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

function isAndroid(){
}
function isIphone(){
}
function isIpad(){
}
function isIOS(){
}

function isAndroid() {
    return /android/i.test(navigator.userAgent)
}
function isIphone(){
    return /iphone/i.test(navigator.userAgent)
}
function isIpad() {
    return /ipad/i.test(navigator.userAgent)
}
function isIOS() {
    return /iphone|ipad/i.test(navigator.userAgent)
}

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