美文网首页
闭包定时器BOM

闭包定时器BOM

作者: 小囧兔 | 来源:发表于2017-06-18 18:10 被阅读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 ++) {
            fnArr[i] = (function(j){
                return function (){
                    return j;
                };
            })(i);
        }
        console.log( fnArr[3]() );  //3
    2.
      var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] = (function (){
                    var a=i;
                 return function (){
                    return a;
                };
            })(i)
        }
        console.log( fnArr[3]() );  //3
    3.
      var fnArr = [];
      for (var i = 0; i < 10; i++) {
          (fnArr[i] = function () {
              return arguments.callee.x;
          }).x = i; // 将x作为函数的一个属性
      }
      console.log( fnArr[3]() );//3
    

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

     var Car = (function(){
          var speed = 0;
          function setSpeed(s){
             return  speed = s
          }
          function getSpeed(){
              return speed;
          }
          function accelerate(s){
           return speed+=10;
          }
          function decelerate(s){
              if(speed>=10){
                  return speed-=10;
              }
          }
          function getStatus(){
              if (speed>0){
                  return "running";
              }else {
                  return "stop";
              }
          }
          return {
              setSpeed: setSpeed,
              geSpeed:getSpeed,
              accelerate:accelerate,
              decelerate:decelerate,
              getStatus:getStatus
          }
      })();
    
      Car.setSpeed(30);
     console.log(Car.geSpeed()) ; //30
     Car.accelerate() ;
      console.log(Car.geSpeed());//40;
      Car.decelerate();
      Car.decelerate();
      console.log(Car.geSpeed());//20
      console.log(Car.getStatus()); // 'running';
      Car.decelerate();
      Car.decelerate();
      console.log(Car.getStatus());  //'stop';
      //Car.speed;  //error
    

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

    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()会在后面执行,先输出1,再给a赋值3,覆盖了前面的1,最后执行定时器函数,里面的a=2覆盖了之前的a=3,所以输出2.
    

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

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

    什么也没有输出,因为flag=true,while条件为true,while就无线循环,setTimeout()会等到别的程序执行完了之后才执行,所以,flag就一直是true,循环也就一直执行。

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

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

    如何获取元素的真实宽高

        function getTrueStyle(elem,name){
            //如果行内样式设置了当前属性
                if(elem.style[name]){
                    return elem.style[name];
    
                }else  if(window.getComputedStyle){
                    var s=window.getComputedStyle(elem,name);
                     return s;
                }
                //兼容IE
                else if(elem.currentStyle){
                    return elem.currentStyle;
                }else {
                    return null;
                }
        }
       let elem = document.getElementById("elem-container");
       let hei=getTrueStyle(elem).height;
       let wid=getTrueStyle(elem).width;
       console.log(wid);
       console.log(hei);
    

    预览

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

    url只能是字母数字和一些标点符号($-_.+!*'(),)组成,所以如果url中有别的字符或者汉字,就必须编码后使用。
    1.如果对整个URL进行编码,那么使用encodeURI(),encodeURI()是Javascript中真正用来对URL编码的函数,如果URI是完整的URI,那么无需对那些保留的并且在URI中有特殊意思的字符进行编码编码后,它输出符号的utf-8形式,并且在每个字节前加上%。

      var url='http://www.jianshu.com/writer#/?a="简书"&b=2';
        var url1=encodeURI(url);
        console.log(url1);//http://www.jianshu.com/writer#/?a=%22%E7%AE%80%E4%B9%A6%22&b=2
        它对应的解码函数是decodeURI()。
        console.log(decodeURI(url1));//http://www.jianshu.com/writer#/?a="简书"&b=2
    

    2.如果对URL的组成部分进行个别编码,使用encodeURIComponent()。
    与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,但在encodeURIComponent()中统统会被编码,

    var url='http://www.jianshu.com/writer#/?a="简书"&b=2';
    console.log(encodeURIComponent(url));//http%3A%2F%2Fwww.jianshu.com%2Fwriter%23%2F%3Fa%3D%22%E7%AE%80%E4%B9%A6%22%26b%3D2
    var url1=encodeURIComponent(url);
    它对应的解码函数是decodeURIComponent(yrl1)//http://www.jianshu.com/writer#/?a="简书"&b=2
    
    

    为什么要编码
    因为URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,所以为了使服务器正确的解析url,就要使用编码的方式。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果,所以使用Javascript先对URL编码,然后再向服务器提交,不给浏览器插手的机会。这样就保证了服务器得到的数据是格式统一的。

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

    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 /(ipad)|(iphone)/i.test(navigator.userAgent);
        }
    

    相关文章

      网友评论

          本文标题:闭包定时器BOM

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