闭包,定时器,BOM

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(n){
              //var n = n;  
                fnArr[i] = function(){
                    return n;
                };
            })(i)
        }
        console.log( fnArr[3]() );

     //方法二: 加入一个立刻执行函数 会生成10个闭包,
        var fnArr = [];
        for(var i=0; i<10; i++){
            (function(){
                var n = i;  
                fnArr[i] = function(){
                    return n;
                };
            })()
        }
        console.log( fnArr[3]() );   

 //方法三: 加入一个立刻执行函数 会生成10个闭包,
        var fnArr = [];
        for(var i=0; i<10; i++){
            fnArr[i] = (function(){
                var n = i;
                return function(){
                    return n;
                }
            })();   
            
        }
        console.log( fnArr[3]() );

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
         }
         function getSpeed(){
          console.log(speed);
         }
         function accelerate(){
          speed += 10;
         }
         function decelerate(){
          speed -= 10;
         }
         function getStatus(){
          if(speed > 0) {
            console.log('running');
          }else{
            speed = 'error';
            console.log('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

  • 经过变量提升,第一个输出的为1,第二个输出为3
  • setTimeout(code|function,millisec)会放在执行代码队列的最后面,最后输出为2

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

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

答:结果是一直不停循环直到浏览器崩溃

  • while(flag=true) {}会一直运行,而setTimeout(code|function,millisec)会放在执行代码队列的最后面,所以flag一直都是true

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

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

答:

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

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

答:

 
     
     


    

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

JavaScript提供四个URL的编码/解码方法。
  • decodeURI() //解码
  • decodeURIComponent() //解码
  • encodeURI() //编码
  • encodeURIComponent() //编码
区别

encodeURI方法不会对下列字符编码

  1. ASCII字母
  2. 数字
  3. ~!@#$&*()=:/,;?+'
    encodeURIComponent方法不会对下列字符编码
  4. ASCII字母
  5. 数字
  6. ~!*()'
    所以encodeURIComponent比encodeURI编码的范围更大。

当我们需要编码一个URL并且要使用的时候,使用encodeURI来编码。当需要编码URL中的参数时,用encodeURIComponent,因为后面的/是需要编码的。
点我

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

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

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