美文网首页
闭包、定时器、

闭包、定时器、

作者: 崔敏嫣 | 来源:发表于2017-03-17 22:21 被阅读0次

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

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

    方法1

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

    方法2

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

    方法3

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

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

    var Car = (function(){
       var speed = 0;
      function setSpeed(s){
           speed = s
       }
       function getSpeed(){
        return speed;
       }
       function accelerate(){
         speed+=10;
       }
       function decelerate(){
        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';
    
    

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

    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);
    }, 0);
    var a ;
    console.log(a);
    a = 3;
    console.log(a);
    

    由于setTimeout()是异步的,在执行一个页面时,即使setTimeout()里的延迟时间设置为0,仍然要在同步代码执行完毕后,才执行setTimeout(),以上代码等同于

    var a = 1;
    var a ;
    console.log(a);//1
    a = 3;
    console.log(a);//3
    setTimeout(function(){
        a = 2;
        console.log(a);
    }, 0);//2
    

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

    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    

    以上代码等同于

    var flag = true;
    while(flag){}
    setTimeout(function(){
        flag = false;
    },0)//会在while()循环结束后执行,但是flag=true,会无限循环,setTimeout()不会执行
    console.log(flag);
    

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

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

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

    Paste_Image.png
    在IE低版本时用currentStyle代替,使用方法是element.currentStyle
    七: URL 如何编码解码?为什么要编码?
    js中有两种编码方式
    encodeURI()方法不会对ASCII字母,数字,~!@#$&()/;?,+'等进行编码
    encodeURIComponent()方法不会对ASCII字母,数字,~!
    ()'等进行编码
    解码方式对应为decodeURI()和decodeURICompenent()
    http协议传输的参数是以key-value键值对形式的,如果传递多个参数,用&对键值对进行分割,用=分割出参数值,但是如果传递的参数本身含有&,=时容易造成歧义。

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

        function isAndroid(){
            return /Andriod/i.test(navigator.userAgent);
    }
    function isIphone(){
        return /iphone/i.test(navigator.userAgent);
    }
    function isIpad(){
        return /ipad/i.test(navigator.userAgent);
    }
    function isIOS(){
        return /ios/i.test(navigator.userAgent);
    }
    

    相关文章

      网友评论

          本文标题:闭包、定时器、

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