閉包,定時(shí)器

什么是閉包?

閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見(jiàn)方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
作用是讀取內(nèi)部變量,這些變量可以保存在內(nèi)存中。

setTimeout 0有什么作用?

其他代碼執(zhí)行后,立即執(zhí)行setTimeout 0 的代碼,
0表示延遲的時(shí)間,也可以作異步執(zhí)行。

代碼

下面的代碼輸出多少?修改代碼讓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(){
    var n = i;
    fnArr[i] = function(){
      return n;
    }
  })();
}
console.log( fnArr[3]() );
*/
/* 方法2
var fnArr = [];
for (var i = 0; i < 10; i++) {
  fnArr[i] = (function(i){
    return function(){ return i; };
  })(i);
}
console.log( fnArr[4]() );

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

var Car = //todo;
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accrlerate();
Car.getSpeed(); //40
Car.decelerate();
Car.decelerate();
Car.getSpeed();
Car.getStatus();
Car.decelerate();
Car.decelerate();
Car.getStatus();

var Car = carSet();
function carSet(){
  var speed = 0;
  function setSpeed(num){
    speed = num;
  }
  function getSpeed(){
    console.log(speed);
  }
  function accelerate(){
    speed += 10;
  }
  function decelerate(){
    speed -= 10;
  }
  function getStatus(){
    if (speed === 0) {
      console.log("stop");
    }
    else {
      console.log("running");
    }
  }
  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

寫(xiě)一個(gè)函數(shù)使用setTimeout模擬setInterval的功能

var i =0;
function inter(){
  setTimeout(function(){console.log(i++);inter();}),1000
}

寫(xiě)一個(gè)函數(shù),計(jì)算setTimeout平均最小時(shí)間粒度

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

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

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

//輸出結(jié)果:1
           3
           2
setTimeout和setInterval 的運(yùn)行機(jī)制是,講代碼一處本次執(zhí)行隊(duì)列,執(zhí)行隊(duì)列都結(jié)束后,在執(zhí)行
setTimeout和senInterval

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

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

無(wú)限循環(huán),沒(méi)有輸出
setTimeout被放在最后執(zhí)行,while(flag)永遠(yuǎn)執(zhí)行

下面代碼輸出?如何輸出delayer:0,delayer:1...

for (var i = 0; i < 5; i++) {
  setTimeout(function(){console.log(
    "delayer:"+ i);
  },0);
  console.log(i);
}
輸出:0
1
2
3
4
delayer:5 輸出5次

for (var i = 0; i < 5; i++) {
  (function(){
    var n = i;
    setTimeout(function(){console.log(
      "delayer:"+ n);
    },0);
    console.log(i);
  })();
}
最后編輯于
?著作權(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)容

  • 問(wèn)題 一、什么是閉包? 有什么作用? 閉包閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在javascript中,只有函...
    婷樓沐熙閱讀 655評(píng)論 0 0
  • 1.什么是閉包? 有什么作用 定義:閉包就是嵌套在函數(shù)里面的內(nèi)部函數(shù),并且該內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)中聲明的所有局...
    饑人谷區(qū)子銘閱讀 1,066評(píng)論 0 2
  • 本教程版權(quán)歸小圓和饑人谷所有,轉(zhuǎn)載須說(shuō)明來(lái)源 問(wèn)題 什么是閉包? 有什么作用閉包(closure)是指有權(quán)訪問(wèn)另一...
    饑人谷__小圓閱讀 534評(píng)論 0 0
  • 問(wèn)題 一、什么是閉包? 有什么作用? 1.什么是閉包①JavaScript高級(jí)程序設(shè)計(jì)第三版定義閉包是指有權(quán)訪問(wèn)另...
    鴻鵠飛天閱讀 573評(píng)論 0 0
  • 1.什么是閉包? 有什么作用 閉包指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域的變量的函數(shù)。創(chuàng)建閉包的常見(jiàn)方式 是 在一個(gè)函數(shù)...
    JunVincetHuo閱讀 1,512評(píng)論 0 2

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