闭包、定时器、BOM

下面的代码输出多少?修改代码让 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 ++) {
      fnArr[i] =  (function(j){
        return function(){
          return j;
        } 
      })(i)
    }
    console.log( fnArr[3]() ) // 3
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
      !function(i){
        fnArr[i] =  function(){
          return i;
        } 
      }(i)
    }
    console.log( fnArr[3]() ) // 3
    var fnArr = [];
    for (let i = 0; i < 10; i ++) {
      fnArr[i] =  function(){
        return i;
      } 
    }
    console.log( fnArr[3]() ) // 3

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

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(){
        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);
    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 a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);

输出结果为:1, 3, 2 ;
原因:

var a = 1;
// 异步执行,setTimeout, 将当前全部执行完成0秒之后再执行 setTimeout 中的函数
setTimeout(function(){ 
    a = 2;
    console.log(a); // 此时 a = 2; 最后执行
}, 0);
var a ;
console.log(a); // 此时 a = 1; 优先执行
a = 3;
console.log(a);  // 此时 a = 3;

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

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

输出结果: 无任何输出;
原因: while(flag){}flag为 true 为死循环,页面会一直加载,无输出。

下面这段代码输出?如何输出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 fn(i){
        return function(){
          console.log('delayer:' + i )
        }
      }
      setTimeout(fn(i),0)
      console.log(i)
    }

如何获取元素的真实宽高

window.getComputedStyle(element, [pseudoElt]).height;
window.getComputedStyle(element, [pseudoElt]).width;
// 第一个参数为元素名,第二个为伪类,可选

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

  • 编码方式:
    encodeURI()
    encodeURIComponent()
    区别:
    encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&* ()=:/,;?+'
    encodeURIComponent 方法不会对下列字符编码 ASCII字母、数字、~!*()'
    所以encodeURIComponentencodeURI编码的范围更大。

  • 解码方式:
    decodeURI()
    decodeURIComponent()

  • 原因
    一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"http://www.abc.com",但是没有希腊字母的网址"http://www.aβγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-
.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"

这意味着,如果URL中有汉字,就必须编码后使用。
参考:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

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

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

推荐阅读更多精彩内容

  • 题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 var fnArr...
    saintkl阅读 38评论 0 0
  • 题目1: 下面的代码输出多少?修改代码让 fnArri 输出 i。使用 两种以上的方法 方法一: 方法二: 方法三...
    南山码农阅读 57评论 0 1
  • 题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 题目2: 封装一个...
    Taaaaaaaurus阅读 28评论 0 0
  • 1.下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 2.封装一个汽车对象,可...
    liushaung阅读 51评论 0 2
  • 1.题目1: 下面的代码输出多少?修改代码让 fnArri 输出 i。使用 两种以上的方法 方法一: 立即执行函数...
    饥人谷_啦啦啦阅读 69评论 0 0