閉包_定時(shí)器_BOM

題目1: 下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法

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

在線預(yù)覽

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

在線預(yù)覽

題目2: 封裝一個(gè)汽車對(duì)象,可以通過(guò)如下方式獲取汽車狀態(tài)

  var Car = (function(){
  var speed = 0;
  function setSpeed(s){
    speed = s
  }
  function getSpeed(s){
    console.log(speed)
  }
  function accelerate(){
    speed += 10
  }
  function decelerate(){
    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,
  }
  })()
  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);
  }, 0);
  var a ;
  console.log(a);
  a = 3;
  console.log(a);
//按照瀏覽器加載順序,全部加載完成,再執(zhí)行,所以最后執(zhí)行setTimeout
//輸出結(jié)果為:
//1 輸出的是var a = 1的值,由于變量提升重新聲明對(duì)值無(wú)影響
//3 輸出的是a = 3
//2 輸出的是setTimeout里函數(shù)中a=2的值

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

  var flag = true;
  setTimeout(function(){
    flag = false;
  },0)//異步執(zhí)行,等待所有任務(wù)結(jié)束后執(zhí)行
  while(flag){}  //只要滿足條件就會(huì)一直循環(huán)
  console.log(flag); //執(zhí)行不到這里,不會(huì)輸出結(jié)果

題目5: 下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來(lái)實(shí)現(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 fn(i){
      setTimeout(function(){
        console.log('delayer:' + i );
      }, 0);
    }
    fn(i)
  }
// delayer:0
// delayer:1
// delayer:2
// delayer:3
// delayer:4

題目6: 如何獲取元素的真實(shí)寬高

<div id="panel_Search" style = "width=200px;height=88px"></div>
<script>
  var panelSearch = document.querySelector('#panel_Search')
  var panelSearchWidth = panelSearch.offsetWidth 
  var panelSearchHeight = panelSearch.offsetHeight
  console.log('該元素寬度為:'+panelSearchWidth+'px')
  console.log('該元素高度為:'+panelSearchHeight+'px')
</script>
// 該元素寬度為:200px
// 該元素高度為:88px

題目7: URL 如何編碼解碼?為什么要編碼?

  • 編碼
    • escape()
      (對(duì)除ASCII字母、數(shù)字、標(biāo)點(diǎn)符號(hào) @ * _ + - . / 以外的其他字符進(jìn)行編碼。)
    • encodeURI()
      (返回編碼為有效的統(tǒng)一資源標(biāo)識(shí)符 (URI) 的字符串,不會(huì)被編碼的字符:! @ # $ & * ( ) = : / ; ? + ' encodeURI()是Javascript中真正用來(lái)對(duì)URL編碼的函數(shù)。)
    • encodeURIComponent('你好')
      (對(duì)URL的組成部分進(jìn)行個(gè)別編碼,而不用于對(duì)整個(gè)URL進(jìn)行編碼)
"%E4%BD%A0%E5%A5%BD"
  • 解碼
    • unescape()
    • decodeURI()
    • decodeURIComponent("%E4%BD%A0%E5%A5%BD")
'你好'

通常如果一樣?xùn)|西需要編碼,說(shuō)明這樣?xùn)|西并不適合傳輸。對(duì)于Url來(lái)說(shuō),之所以要進(jìn)行編碼,是因?yàn)閁rl中有些字符會(huì)引起歧義。

  • 例如,Url參數(shù)字符串中使用key=value鍵值對(duì)這樣的形式來(lái)傳參,鍵值對(duì)之間以&符號(hào)分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么勢(shì)必會(huì)造成接收Url的服務(wù)器解析錯(cuò)誤,因此必須將引起歧義的&和=符號(hào)進(jìn)行轉(zhuǎn)義,也就是對(duì)其進(jìn)行編碼。

  • 又如,Url的編碼格式采用的是ASCII碼,而不是Unicode,這也就是說(shuō)你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務(wù)端瀏覽器支持的字符集不同的情況下,中文可能會(huì)造成問(wèn)題。

Url編碼的原則就是使用安全的字符(沒(méi)有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符。

其他:


關(guān)于URL編碼-阮一峰

題目8: 補(bǔ)全如下函數(shù),判斷用戶的瀏覽器類型

function isAndroid(){
  return /Android/i.test(navigator.userAgent)
}
funcnction isIphone(){
  return /iphone/i.test(navigator.userAgent)
}
function isIpad(){
  return /ipad/i.test(navigator.userAgent)
}
function isIOS(){
  return /ios/i.test(navigator.userAgent)
}

參考文檔

為什么要進(jìn)行URL編碼
js對(duì)url進(jìn)行編碼和解碼(三種方式區(qū)別)
JS 中的閉包是什么?
什么是異步?
定時(shí)器
閉包
bom
js獲取網(wǎng)頁(yè)和元素的寬度、高度

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

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

  • 題目1: 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法 方法一: 方法二: 方法三...
    南山碼農(nóng)閱讀 342評(píng)論 0 1
  • 題目1: 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法 輸出10 修改為1var ...
    我是一只_魚(yú)閱讀 268評(píng)論 0 1
  • 題目1: 下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法 題目2: 封裝一個(gè)...
    Taaaaaaaurus閱讀 425評(píng)論 0 0
  • 題目1: 下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法 var fnArr...
    saintkl閱讀 433評(píng)論 0 0
  • 早上起床遙望小區(qū)中間,發(fā)現(xiàn)桃花開(kāi)了,梨花開(kāi)了,鐵海棠開(kāi)了,報(bào)春花也開(kāi)了。小鳥(niǎo)在窗外喳喳的叫,它知道早起有蟲(chóng)吃,我也...
    高琳旭閱讀 153評(píng)論 0 0

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