閉包、定時器、BOM

1.下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() );  //

方法一

    
  //IIFE 閉包
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(num){
            return function(){
              return num
            };
        }(i);
    }
    console.log( fnArr[3]() );

方法二:


//ES6的let來申明i
   var fnArr = [];
    for (let i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() );

方法三:

var fnArr = [];
    for (let i = 0; i < 10; i ++) {
        
      !function(i){
          fnArr[i] =  function(){
            return i;
        };
      }(i);
    
    }
    console.log( fnArr[3]() );

2.封裝一個汽車對象,可以通過如下方式獲取汽車狀態(tài)

var Car = (function(){
   var speed = 0;
   function setSpeed(s){
       speed = s;
   }
   function getSpeed(){
     console.log(speed);
   }
   function accelerate(){
      speed += 10;
   }
   function decelerate(){
      if((speed - 10) <=0){
        speed = 0;
      }else{
         speed -= 10;
      }
   }
   function getStatus(){
     if(speed >0){
       console.log('running');
     }else{
       console.log('stop');
     }
   }
   return {
      setSpeed: setSpeed,
      getSpeed: getSpeed,
     accelerate: accelerate,
     decelerate: decelerate,
     getStatus: getStatus,
     speed:'error'
   };
})();
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.下面這段代碼輸出結(jié)果是? 為什么?

var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);//2
}, 0);
var a ;
console.log(a);//1
a = 3;
console.log(a);//3

輸出的結(jié)果為1,3,2。因為瀏覽器在執(zhí)行上述代碼的時候,執(zhí)行的setTimeout的時候,會啟動一個計時器,設(shè)定一個代碼指定的時間,上述代碼設(shè)置了0秒,然后瀏覽器就會繼續(xù)執(zhí)行接下去的代碼,即使期間計時器的時間已經(jīng)到了。等到代碼執(zhí)行完畢,接著會執(zhí)行setTimeout里需要執(zhí)行的函數(shù)。

4.下面這段代碼輸出結(jié)果是? 為什么?

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

console.log輸出的結(jié)果為true,因為setTimeout及時設(shè)置的時間已經(jīng)到了,也會等到后續(xù)的代碼執(zhí)行完畢才開始運行需要執(zhí)行的函數(shù),但是上述代碼中的while循環(huán)的條件為flag然而flag的值為true,導(dǎo)致while會一直在運行。所以setTimeout里的函數(shù)所執(zhí)行的flag =false永遠不會執(zhí)行。

5.下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現(xiàn))

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(i){
      setTimeout(function(){
         console.log('delayer:' + i );
      }, 0);  
      
    }(i);
    
    console.log(i);
}

6.如何獲取元素的真實寬高

offsetHeightoffsetWidth

var intElemOffsetHeight = document.getElementById(id_attribute_value).offsetHeight;
var intElemOffsetWidth = document.getElementById(id_attribute_value).offsetWidth;

7.URL 如何編碼解碼?為什么要編碼?

var uri = "https://w3schools.com/my test.asp?name=st?le&car=saab";
var uri_enc = encodeURIComponent(uri); //編碼
var uri_dec = decodeURIComponent(uri_enc); //解碼
var res = uri_enc + "<br>" + uri_dec;

結(jié)果

// Encoded URI
https%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab

// Decoded URI
https://w3schools.com/my test.asp?name=st?le&car=saab

為什么要編碼
因為網(wǎng)絡(luò)標(biāo)準(zhǔn)RFC 1738做了硬性規(guī)定:

"...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."
"只有字母和數(shù)字[0-9a-zA-Z]、一些特殊符號"$-
.+!*'(),"[不包括雙引號]、以及某些保留字,才可以不經(jīng)過編碼直接用于URL。"

8.補全如下函數(shù),判斷用戶的瀏覽器類型

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容