进阶11

作者: 饥人谷_星璇 | 来源:发表于2017-10-09 18:58 被阅读0次

    题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法

        var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                return i;
            };
        }
        console.log( fnArr[3]() );  //10
    
        var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            ~function(i){
                fnArr[i] =  function(){
                return i;
                };
            }(i)
        }
        console.log( fnArr[3]() );  //方法一:立即执行的函数表达式,在i递增之前运行函数保存变量的值。
    
        var fnArr = [];
        for (var i = 0; i < 10; i ++) {
                fnArr[i] =  function(i){
                return function(){
                    return i;
                }
                }(i)
            }
        console.log( fnArr[3]() );  //方法二:3,让函数直接运行,存储i的变量,返回一个函数,思路与方法一一样,在i递增之前运行函数保存变量的值。
    
        var fnArr = [];
        for (let i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                return i;
            };
        }
        console.log( fnArr[3]() );  //方法三:使用ES6中的let
    

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

    var Car = (function(){
       var speed = 0;
       function setSpeed(s){
           speed = s;
           console.log(speed);
       }
       function getSpeed(s){
           console.log(speed);
           return speed;
       }
       function accelerate(){
           speed += 10;
           console.log(speed);
       }
       function decelerate(){
           speed -= 10;
           console.log(speed);
       }
       function getStatus(){
           if(speed === 0){
            console.log("stop");
            return "stop";
           }else if(speed > 0){
            console.log("running");
            return "running";
           }else{
            speed = 0;
            console.log("stop");
            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);  //2
    }, 0);
    var a ;
    console.log(a);  //1
    a = 3;
    console.log(a);  // 3
    
    • 输入顺序是1 3 2.因为即使设置0秒后运行函数,但是依旧会在代码读取运行完之后才会运行函数。

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

    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    
    • 因为即使设置0秒后运行函数,依旧会在代码读取运行完之后才会运行函数,所以在函数运行到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);
    }
    
    • 先输入0、1、2、3、4,然后输入5次delayer:5。
        for(var i=0;i<5;i++){
        setTimeout(function(i){
             console.log('delayer:' + i );
        }(i), 0);
        console.log(i);
    }   //方法一
    
        for(var i=0;i<5;i++){
        ~function(i){
            setTimeout(function(){
                 console.log('delayer:' + i );
            }, 0);
        }(i)
    } //方法二
    
    for(let i=0;i<5;i++){
        setTimeout(function(){
             console.log('delayer:' + i );
        }, 0);
    }  //方法三
    

    题目6: 如何获取元素的真实宽高

    • getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。使用范例:
     var test = document.querySelector(".test")
         getComputedStyle(test,pse).width //获取宽度,第二个参数为伪类,没有则不设置
         getComputedStyle(test,pse).height //获取高度,第二个参数为伪类,没有则不设置
    
    • 低版本IE不兼容getComputedStyle,可以使用currentStyle,兼容方式:
    element.currentStyle ?
        element.currentStyle : window.getComputedStyle(element, null)
    

    题目7: URL 如何编码解码?为什么要编码?

    • JavaScript提供四个URL的编码/解码方法。
      解码:
      1.decodeURI()
      2.decodeURIComponent()
      编码:
      1.encodeURI()
      2.encodeURIComponent()
    • encodeURI方法不会对下列字符编码
    1. ASCII字母
    2. 数字
    3. ~!@#$&*()=:/,;?+'
    • encodeURIComponent方法不会对下列字符编码
    1. ASCII字母
    2. 数字
    3. ~!*()'
      所以encodeURIComponent比encodeURI编码的范围更大。
    • 为什么要编码:
      因为用户使用的浏览器,操作系统,网页字符集等等都不是一样的。所以使用 javacript 预先对URL进行编码,不让浏览器来处理,保证服务器得到的数据总是一致的。

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

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

    相关文章

      网友评论

          本文标题:进阶11

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