中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

岐山县| 纳雍县| 成都市| 邹城市| 集安市| 洪湖市| 习水县| 蓝田县| 夹江县| 鲁山县| 漳平市| 漠河县| 故城县| 石渠县| 红安县| 昌图县| 黄陵县| 太仆寺旗| 三门县| 青河县| 临洮县| 合川市| 双牌县| 聂拉木县| 博乐市| 曲靖市| 朝阳区| 邵阳县| 旬邑县| 江都市| 蒙城县| 明星| 巴彦县| 潼南县| 洪江市| 新源县| 绥德县| 五家渠市| 康保县| 中超| 枣阳市|