亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS的閉包與定時器這么實現

發布時間:2022-03-14 17:17:56 來源:億速云 閱讀:204 作者:iii 欄目:web開發

這篇文章主要講解了“JS的閉包與定時器這么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JS的閉包與定時器這么實現”吧!

  什么是閉包?有什么作用

  閉包就是能夠讀取其他函數內部變量的函數。

  作用:1.可以讀取函數內部的變量2.讓這些變量的值始終保持在內存中。

  setTimeout0有什么作用

  js運行是基于單線程的,意味著一段代碼執行時,其他代碼將進入隊列等待,一旦線程有空閑就執行后續代碼。如果代碼中設定了一個setTimeout,那么瀏覽器便會在合適的時間,將代碼插入任務隊列,如果這個時間設為0,就代表立即插入隊列,但并不是立即執行,仍然要等待前面代碼執行完畢(其實有個延時,具體是16ms還是4ms取決于瀏覽器)。所以setTimeout并不能保證執行的時間,是否及時執行取決于JavaScript線程是擁擠還是空閑。

  代碼

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

  varfnArr=[];

  for(vari=0;i<10;i++){

  fnArr[i]=function(){

  returni;

  };

  }

  console.log(fnArr3);//

  代碼:

  方法一:

  varfnArr=[];

  for(vari=0;i<10;i++){

  fnArr[i]=(function(){

  varindex=i;

  varfn=function(){

  returnindex

  }

  returnfn

  }());

  }

  console.log(fnArr3);//

  方法二:

  varfnArr=[];

  for(vari=0;i<10;i++){

  (function(n){

  fnArr[i]=function(){

  returnn;

  }

  })(i)

  };

  console.log(fnArr3)

  使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態

  varCar=//todo;

  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

  代碼:

  varCar=(function(){

  varspeed;

  functionsetSpeed(n){

  speed=n

  }

  functiongetSpeed(){

  returnconsole.log(speed);

  }

  functionaccelerate(){

  speed+=10

  returnspeed;

  }

  functiondecelerate(){

  speed-=10

  returnspeed;

  }

  functiongetStatus(){

  returnconsole.log(speed===0?'stop':'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';

  Car.speed();//error

  寫一個函數使用setTimeout模擬setInterval的功能

  代碼:

  vari=0;

  functionintv(){

  setTimeout(function(){

  console.log(i++);

  intv();

  },1000);

  }

  intv();

  寫一個函數,計算setTimeout最小時間粒度

  代碼:

  functiongetmin(){

  vari=0;

  varstart=Date.now();

  varclock=setTimeout(function(){

  i++;

  if(i===1000){

  clearTimeout(clock);

  varend=Date.now();

  console.log((end-start)/i)

  }

  clock=setTimeout(arguments.callee,0)

  },0)

  }

  getmin()

  下面這段代碼輸出結果是?為什么?

  vara=1;

  setTimeout(function(){

  a=2;

  console.log(a);

  },0);

  vara;

  console.log(a);

  a=3;

  console.log(a);

  這段代碼的輸出結果為1;3;2,因為代碼中設定了一個setTimeout,那么瀏覽器便會在合適的時間,將代碼插入任務隊列,如果這個時間設為0,就代表立即插入隊列,但并不是立即執行,仍然要等待前面代碼執行完畢,所以要等代碼全部執行完畢后才執行setTimeout(function(){a=2;console.log(a);},0);。

  下面這段代碼輸出結果是?為什么?

  varflag=true;

  setTimeout(function(){

  flag=false;

  },0)

  while(flag){}

  console.log(flag);

  不會輸出結果,因為setTimeout(function(){flag=false;},0)會在所有代碼執行完畢后才運行,``flag初始值為true,所以while會一直循環下去,console.log(flag)也不會被訪問,但是由于某些瀏覽器會存在環路保護功能,所以也有可能輸出為true```。

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

  for(vari=0;i<5;i++){

  setTimeout(function(){

  console.log('delayer:'+i);

  },0);

  console.log(i);

  }

  代碼:

  for(vari=0;i<5;i++){

  (function(i){

  setTimeout(function(){

  console.log('delayer:'+i);

  },0);

  })(i)

  console.log(i);

  }

  燒腦題

  如下console.log的結果是什么?為什么?

  functionfn(a,b){

  console.log(b);

  return{

  fn:function(c){

  returnfn(c,a);

  }

  };

  }

  vara=fn(0);

  a.fn(1);

  a.fn(2);

  a.fn(3);

  varb=fn(0).fn(1).fn(2).fn(3);

  varc=fn(0).fn(1);

  c.fn(2);

  c.fn(3);

感謝各位的閱讀,以上就是“JS的閉包與定時器這么實現”的內容了,經過本文的學習后,相信大家對JS的閉包與定時器這么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節
推薦閱讀:
  1. JS閉包
  2. js閉包的理解

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

商河县| 绥化市| 阜城县| 丹寨县| 芦溪县| 惠东县| 怀柔区| 宁城县| 喀喇| 安多县| 南川市| 阳东县| 嘉荫县| 集安市| 湄潭县| 东台市| 西安市| 莱阳市| 太谷县| 汝州市| 黔东| 宿迁市| 中方县| 江川县| 渭源县| 绥棱县| 新余市| 平原县| 肥城市| 大埔县| 增城市| 疏附县| 金阳县| 四会市| 桓台县| 东台市| 冀州市| 江油市| 枞阳县| 清涧县| 北流市|