關(guān)于閉包快耿、定時(shí)器

1.什么是閉包? 有什么作用

  • 閉包指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域的變量的函數(shù)囊陡。創(chuàng)建閉包的常見(jiàn)方式 是 在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),并可以將一個(gè)函數(shù)返回掀亥。
  • 官方對(duì)閉包的解釋是:一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù))撞反,因而這些變量也是該表達(dá)式的一部分。閉包的特點(diǎn):
  • 作為一個(gè)函數(shù)變量的一個(gè)引用搪花,當(dāng)函數(shù)返回時(shí)遏片,其處于激活狀態(tài)
  • 一個(gè)閉包就是當(dāng)一個(gè)函數(shù)返回時(shí)鳍侣,一個(gè)沒(méi)有釋放資源的棧區(qū)丁稀。簡(jiǎn)單的說(shuō)script允許使用內(nèi)部函數(shù)---即函數(shù)定義和函數(shù)表達(dá)式位于另一個(gè)函數(shù)的函數(shù)體內(nèi)。而且倚聚,這些內(nèi)部函數(shù)可以訪問(wèn)它們所在的外部函數(shù)中聲明的所有局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)凿可。當(dāng)其中一個(gè)這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時(shí)惑折,就會(huì)形成閉包。
  • 在我的理解看來(lái)枯跑,閉包的作用是可以操作一個(gè)函數(shù)的局部變量惨驶。而阮一峰的解釋是閉包可以用在許多地方。它的最大用處有兩個(gè)敛助,一個(gè)是前面提到的可以讀取函數(shù)內(nèi)部的變量粗卜,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中

可以看demo來(lái)理解:

//沒(méi)有使用閉包
for(var i =0; i<5; i++){
  setTimeout(function(){
    console.log('a'+i)
  },0)
    }

這個(gè)函數(shù)輸出的結(jié)果并不是想象的a0,a1,a2,a3,a4,而是5個(gè)a4纳击,這是因?yàn)樗鼒?zhí)行函數(shù)時(shí)续扔,i在函數(shù)里面并沒(méi)有聲明攻臀,因此他向外尋找刨啸,而i到4的時(shí)候停止循環(huán)识脆,因此尋找到i=4,所以离例,這就是得出5個(gè)a4的原因悉稠。
那么,我們可以使用閉包避免這個(gè)問(wèn)題洒扎,如下

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

原因是:它構(gòu)建一個(gè)只有自己本身才可訪問(wèn)的閉包袍冷,保存只供本身使用的變量(在我理解就是猫牡,在閉包里面處理各種變量淌友。)

參考:
阮一峰學(xué)習(xí)Javascript閉包(Closure)

2.setTimeout () 有什么作用

  1. 起到一個(gè)倒計(jì)時(shí)運(yùn)行的作用,時(shí)間設(shè)置為多少瑰抵,他就延遲多少時(shí)間運(yùn)行二汛,倘若是0就立即執(zhí)行
  2. 將setTimeout()里面的代碼放置代碼的最后運(yùn)行
 var a=1;
 setTimeout(function(){
     console.log('before',a);
     a = 2;
     console.log('after',a);
},0);

     a=100;
     console.log(a);
    
//得出的結(jié)果先是 100
               before 100     
               after 2

代碼

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

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

思路:可以用閉包讓fnArri輸出i

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

2.使用閉包封裝一個(gè)汽車對(duì)象婿着,可以通過(guò)如下方式獲取汽車狀態(tài)

var car =(function(){
    var i =0;

    function setSpeed(k){
          i =k;
    }

    function getSpeed(){
      return i;
  }
    function accelerate(){
      i=i+10;
}
  function decelerate(){
    i=i-10;
}
function getStatus(){
    if(i>0){
        return 'running';
      }
    else
       {
        return 'stop';
      }
}
return {
    getSpeed:getSpeed,
    setSpeed:setSpeed,
    accelerate:accelerate,
    decelerate: decelerate,
    getStatus: getStatus
}
})();
Car.setSpeed(30);
console.log(Car.getSpeed());//30
Car.accelerate();
console.log(Car.getSpeed());//40;
Car.decelerate();
Car.decelerate();
console.log(Car.getSpeed()); //20
console.log(Car.getStatus()); // 'running';
Car.decelerate();
Car.decelerate();
console.log(Car.getStatus());  //'stop';
  1. 寫(xiě)一個(gè)函數(shù)使用setTimeout模擬setInterval的功能
var i =0;
function setInterval(){
  setTimeout(function(){
  console.log(i++)
  setInterval())
},1000)

  setInterval();

4.寫(xiě)一個(gè)函數(shù)提完,計(jì)算setTimeout平均[備注:新加]最小時(shí)間粒度

function getMini(){
  var i =0;
  var start = Date.now();
  var clock = setTimeout(function(){
     i++;
     if(i === 1000){
      clearTimeout(clock);
      var end = Date.now();
      console.log((start-end) / i) )
  }
  clock = setTimeout(arguments.callee,0)
},0)

5.下面這段代碼輸出結(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
//但是console.log的順序是 1,3,2
//這是因?yàn)閟etTimeout會(huì)讓代碼放到代碼最后執(zhí)行

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

var flag = true;
setTimeout(function(){ 
flag = false;
},0)
while(flag){}
console.log(flag);
//這里并沒(méi)有輸出結(jié)果氯葬,因?yàn)閣hile(flag)會(huì)一直判斷是true帚称,這就會(huì)一直執(zhí)行循環(huán)秽澳,因此下面的代碼并不會(huì)執(zhí)行 

7.下面這段代碼輸出担神?如何輸出delayer: 0, delayer:1...(使用閉包來(lái)實(shí)現(xiàn))

for(var i=0;i<5;i++){ 
setTimeout(function(){ 
console.log('delayer:' + i );//delayer5
 }, 0); 
console.log(i);} //5
for(var i=0;i<5;i++){
(function(num){
      setTimeout(function(){
      console.log('delayer:'+num);
    },0)
})(i);
console.log(i);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妄讯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躬窜,更是在濱河造成了極大的恐慌炕置,老刑警劉巖朴摊,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異口锭,居然都是意外死亡讹弯,警方通過(guò)查閱死者的電腦和手機(jī)这溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)悲靴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)癞尚,“玉大人,你說(shuō)我怎么就攤上這事浇揩。” “怎么了积锅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵养盗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我箫爷,道長(zhǎng)聂儒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任窜护,我火速辦了婚禮柄慰,結(jié)果婚禮上税娜,老公的妹妹穿的比我還像新娘。我一直安慰自己敬矩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布凳忙。 她就那樣靜靜地躺著涧卵,像睡著了一般腹尖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天讼庇,我揣著相機(jī)與錄音蠕啄,去河邊找鬼戈锻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘹承,可吹牛的內(nèi)容都是我干的如庭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骤竹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼往毡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懒震,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤个扰,失蹤者是張志新(化名)和其女友劉穎葱色,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體办龄,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俐填,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年玷禽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呀打。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撩银,死狀恐怖豺憔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恭应,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布境肾,位于F島的核電站奥喻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏环鲤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一冷离、第九天 我趴在偏房一處隱蔽的房頂上張望西剥。 院中可真熱鬧,春花似錦蔫耽、人聲如沸留夜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钦讳。三九已至,卻和暖如春愿卒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背易结。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工柜候, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹦肿。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓箩溃,卻偏偏與公主長(zhǎng)得像碌识,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子开泽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 什么是閉包? 有什么作用閉包:函數(shù)對(duì)象可以通過(guò)作用域鏈相互關(guān)聯(lián)旅薄,函數(shù)體內(nèi)部的變量可以保存在函數(shù)的作用域內(nèi)。 上述代...
    coolheadedY閱讀 725評(píng)論 0 0
  • 1.什么是閉包? 有什么作用洛口? 閉包是指有權(quán)訪問(wèn)其他函數(shù)作用域中的變量的函數(shù)凯沪。 詳細(xì)解釋:就是在一個(gè)函數(shù)中,父函數(shù)...
    Sheldon_Yee閱讀 1,135評(píng)論 2 2
  • 本教程版權(quán)歸小圓和饑人谷所有脂崔,轉(zhuǎn)載須說(shuō)明來(lái)源 問(wèn)題 什么是閉包? 有什么作用閉包(closure)是指有權(quán)訪問(wèn)另一...
    饑人谷__小圓閱讀 491評(píng)論 0 0
  • 閉包 定義「一個(gè)函數(shù)」+「訪問(wèn)到的外部變量」= 閉包 作用創(chuàng)建內(nèi)部變量瞻佛,既不能被外部隨意修改,又可以通過(guò)指定的函數(shù)...
    jrg_memo閱讀 492評(píng)論 0 0
  • 問(wèn)答 什么是閉包? 有什么作用答:“官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一...
    饑人谷_桶飯閱讀 216評(píng)論 0 0