閉包屁奏、定時器、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永遠(yuǎn)不會執(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菱父,隨后出現(xiàn)的幾起案子颈娜,更是在濱河造成了極大的恐慌剑逃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛹磺,死亡現(xiàn)場離奇詭異,居然都是意外死亡同仆,警方通過查閱死者的電腦和手機(jī)萤捆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俗批,“玉大人俗或,你說我怎么就攤上這事∷晖” “怎么了辛慰?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長干像。 經(jīng)常有香客問我帅腌,道長,這世上最難降的妖魔是什么蝠筑? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任狞膘,我火速辦了婚禮,結(jié)果婚禮上什乙,老公的妹妹穿的比我還像新娘挽封。我一直安慰自己,他們只是感情好臣镣,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布辅愿。 她就那樣靜靜地躺著,像睡著了一般忆某。 火紅的嫁衣襯著肌膚如雪点待。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天弃舒,我揣著相機(jī)與錄音癞埠,去河邊找鬼。 笑死聋呢,一個胖子當(dāng)著我的面吹牛苗踪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播削锰,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼通铲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了器贩?” 一聲冷哼從身側(cè)響起颅夺,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤朋截,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吧黄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體部服,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年稚字,在試婚紗的時候發(fā)現(xiàn)自己被綠了饲宿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡胆描,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗阅,到底是詐尸還是另有隱情昌讲,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布减噪,位于F島的核電站短绸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筹裕。R本人自食惡果不足惜醋闭,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朝卒。 院中可真熱鬧证逻,春花似錦、人聲如沸抗斤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑞眼。三九已至龙宏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伤疙,已是汗流浹背银酗。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留徒像,地道東北人黍特。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像厨姚,于是被迫代替她去往敵國和親衅澈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容