国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JavaScript > 正文

JS的閉包與定時器

2020-03-24 17:09:42
字體:
來源:轉載
供稿:網友
這次給大家帶來JS的閉包與定時器,使用JS的閉包與定時器的注意事項有哪些,下面就是實戰案例,一起來看一下。

什么是閉包? 有什么作用
閉包就是能夠讀取其他函數內部變量的函數。
作用:1.可以讀取函數內部的變量2.讓這些變量的值始終保持在內存中。

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

代碼

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

var fnArr = [];for (var i = 0; i i ++) {fnArr[i] = function(){return i;console.log( fnArr3 ); //

代碼:
方法一:

var fnArr = [];for (var i = 0; i i ++) {fnArr[i] = (function(){var index = i;var fn = function(){return indexreturn fn}());console.log( fnArr3 ); //

方法二:

var fnArr = [];for (var i = 0; i i ++) {(function(n){fnArr[i] = function(){return n;})(i)console.log( fnArr3 )

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

var Car = //todo;Car.setSpeed(30);Car.getSpeed(); //30Car.accelerate();Car.getSpeed(); //40;Car.decelerate();Car.decelerate();Car.getSpeed(); //20Car.getStatus(); // running Car.decelerate();Car.decelerate();Car.getStatus(); // stop //Car.speed; //error

代碼:

var Car = (function(){var speed;function setSpeed(n){speed = nfunction getSpeed(){return console.log(speed);function accelerate(){speed +=10return speed;function decelerate(){speed -=10return speed;function getStatus(){return console.log(speed===0? stop : running return {setSpeed:setSpeed,getSpeed:getSpeed,accelerate:accelerate,decelerate:decelerate,getStatus:getStatus,}());Car.setSpeed(30);Car.getSpeed(); //30Car.accelerate();Car.getSpeed(); //40;Car.decelerate();Car.decelerate();Car.getSpeed(); //20Car.getStatus(); // running Car.decelerate();Car.decelerate();Car.getStatus(); // stop Car.speed(); //error

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

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

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

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

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

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

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

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

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

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

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

for(var i=0;i i++){setTimeout(function(){console.log( delayer: + i );}, 0);console.log(i);}

代碼:

for(var i=0;i i++){(function(i){setTimeout(function(){console.log( delayer: + i );}, 0);})(i)console.log(i);}

燒腦題

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

function fn(a,b) {console.log(b);return {fn:function(c){return fn(c,a);var a = fn(0);a.fn(1);a.fn(2);a.fn(3);var b = fn(0).fn(1).fn(2).fn(3);var c = fn(0).fn(1);c.fn(2);c.fn(3);

相信看了本文案例你已經掌握了方法,更多精彩請關注php 其它相關文章!

相關閱讀:

簡易的CSS3點擊響應動畫案列

如何使用python來判斷圖片相似度

以上就是JS的閉包與定時器的詳細內容,html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张掖市| 泊头市| 江西省| 乐东| 都江堰市| 临清市| 湖南省| 荔浦县| 蒙山县| 元江| 巴塘县| 光山县| 夏河县| 玉溪市| 聊城市| 平乡县| 崇礼县| 辉县市| 丹江口市| 洮南市| 新安县| 万州区| 新晃| 裕民县| 伊金霍洛旗| 北流市| 行唐县| 光泽县| 文水县| 青浦区| 新密市| 石门县| 桂林市| 凤台县| 乾安县| 新乡市| 罗田县| 富蕴县| 崇左市| 防城港市| 晋州市|