美文网首页
定时器、闭包

定时器、闭包

作者: 七_五 | 来源:发表于2017-05-14 16:59 被阅读0次

    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
    

    方法一:

    立即执行函数内return匿名函数

    方法二:

    立即执行函数内创建fnArr[i]为匿名函数

    方法三:

    立即执行函数通过传参来实现闭包的效果

    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';
    
    闭包封装

    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);
    }
    

    输出:


    image.png 闭包实现

    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)
    }
    

    相关文章

      网友评论

          本文标题:定时器、闭包

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