摘要:為了規(guī)避這個(gè)問題,可以使用定時(shí)器對(duì)事件處理程序進(jìn)行節(jié)流。當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會(huì)清除前一次的定時(shí)器,并設(shè)置另一個(gè)。如果前一個(gè)定時(shí)器已經(jīng)執(zhí)行過了,這個(gè)操作就沒有任何意義。然而如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器。
高級(jí)定時(shí)器
為了解決setInterval的一些執(zhí)行問題, 下面是采用鏈?zhǔn)絪etTimeout的方式來(lái)規(guī)避:
setTimeout(function() { // add code here setTimeout(arguments.callee, interval); }, interval);
避免使用arguments.callee:
setTimeout(function func () { // body... setTimeout(func, interval); }, interval);Yielding Processes
腳本長(zhǎng)時(shí)間運(yùn)行的原因: 過長(zhǎng)的、 過深嵌套的函數(shù)調(diào)用; 進(jìn)行大量的處理循環(huán)。
在展開循環(huán)之前, 你需要考慮兩個(gè)重要的問題:
該出事是否必須同步完成?
數(shù)據(jù)是否必須按順序完成?
當(dāng)你發(fā)現(xiàn)有些循環(huán)占用大量的事件, 同時(shí)對(duì)上述兩個(gè)問題答案都是否, 那么可以使用定時(shí)器來(lái)分隔這個(gè)循環(huán)。
setTimeout(function() { //取出下一個(gè)條目處理 var item = array.shift(); process(item); //還有條目,再設(shè)置一個(gè)定時(shí)器 if (array.length > 0) { setTimeout(arguments.callee, interval); } }, interval);
如:
var div = document.getElementById("div"); var arr = [321, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31, 32, 1432, 432, 432, 321, 5435, 6454, 6576, 56434, 2321, 321, 31]; for (var i = 0, len = arr.length; i < len; i++) { div.innerHTML += arr[i] + "函數(shù)節(jié)流
"; }; //16ms 用時(shí) setTimeout(function shiftArr() { var item = arr.shift(); div.innerHTML += item + "
"; if (arr.length > 0) { setTimeout(shiftArr, 0); } }, 0) //58.2ms 用時(shí)
對(duì)一些持續(xù)不斷觸發(fā)的事件, 如果建立的事件處理程序不夠好的話, 會(huì)導(dǎo)致瀏覽器崩潰或者其他的事故。 為了規(guī)避這個(gè)問題, 可以使用定時(shí)器對(duì)事件處理程序進(jìn)行節(jié)流。
函數(shù)節(jié)流背后的基本思想是: 一些代碼不可以在沒有間斷的情況下連續(xù)重復(fù)執(zhí)行。 具體做法是: 第一次調(diào)用函數(shù), 創(chuàng)建一個(gè)定時(shí)器, 在指定的時(shí)間間隔后運(yùn)行代碼。 當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí), 它會(huì)清除前一次的定時(shí)器, 并設(shè)置另一個(gè)。 如果前一個(gè)定時(shí)器已經(jīng)執(zhí)行過了, 這個(gè)操作就沒有任何意義。 然而如果前一個(gè)定時(shí)器尚未執(zhí)行, 其實(shí)就是將其替換為一個(gè)新的定時(shí)器。 目的就是執(zhí)行函數(shù)的請(qǐng)求停止了一段時(shí)間之后才執(zhí)行。 以下是該模式的基本形式:
var processor = { timeoutId: null, performProcessing: function() { //實(shí)際執(zhí)行的處理程序 }, process: function() { clearTimeout(this.timeoutId); var that = this; this.timeoutId = setTimeout(function() { that.performProcessing(); }, 1000); } }; processor.process(); //嘗試開始執(zhí)行
只要代碼是周期性執(zhí)行的, 都應(yīng)該用節(jié)流。 處理的速率根據(jù)需求設(shè)置, 上面的例子是1000毫秒。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78806.html
摘要:如果直接調(diào)用構(gòu)造函數(shù),那么會(huì)指向全局對(duì)象然后你的代碼就會(huì)覆蓋的原生。凍結(jié)對(duì)象最嚴(yán)格的防篡改就是凍結(jié)對(duì)象。中央定時(shí)器動(dòng)畫地址參考書籍高級(jí)程序設(shè)計(jì)忍者秘籍 1 安全類型檢測(cè) javascript內(nèi)置類型檢測(cè)并不可靠 safari某些版本( var person = {name: wdd}; undefined > Object.preventExtensions(person); Obj...
摘要:關(guān)于定時(shí)器要記住的最重要的事情是指定的時(shí)間間隔表示何時(shí)將定時(shí)器的代碼添加到隊(duì)列,而不是何時(shí)實(shí)際執(zhí)行代碼。多個(gè)定時(shí)器之間的執(zhí)行間隔會(huì)比預(yù)期的小解決辦法處理中數(shù)組分塊,,函數(shù)節(jié)流,實(shí)際進(jìn)行處理的方法實(shí)際執(zhí)行的代碼初始處理調(diào)用的方法 一、高級(jí)函數(shù) 安全類型檢測(cè) Object.protitype.toString.call(value) 作用域安全的構(gòu)造函數(shù) function Pers...
摘要:高級(jí)定時(shí)器高級(jí)技巧異步首先,中沒有代碼是立即執(zhí)行的,而是一旦進(jìn)程空閑則立即執(zhí)行。針對(duì)第二種問題,使用定時(shí)器是解決方法之一。為定時(shí)器設(shè)定的時(shí)間間隔使得進(jìn)程有時(shí)間在處理項(xiàng)目的事件之間轉(zhuǎn)入空閑。該函數(shù)首先清除之前設(shè)置的任何定時(shí)器。 title: 高級(jí)定時(shí)器 date: 2016-12-13 tag: JS高級(jí)技巧 0x00 異步 首先,JavaScript 中沒有代碼是立即執(zhí)行的,...
摘要:閉包閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)當(dāng)某個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境及相應(yīng)的作用域鏈。要注意通過第句聲明的這個(gè)方法屬于構(gòu)造函數(shù)生成的對(duì)象,而不屬于構(gòu)造函數(shù)的變量對(duì)象,也就是說(shuō),并不存在于作用域鏈中。 看到評(píng)論里有仁兄建議我試試箭頭函數(shù),真是受寵若驚,本來(lái)寫這篇文章也只是想記錄寫要點(diǎn)給自己日后看的。今天早上看到一篇總結(jié)javascript中this的文章JavaScr...
摘要:下面通過幾個(gè)的定時(shí)器示例以及相關(guān)源碼來(lái)分析在中,功能到底是怎么實(shí)現(xiàn)的。我們知道,中的定時(shí)器并不同于計(jì)算機(jī)底層的定時(shí)中斷。補(bǔ)充資料在高級(jí)程序設(shè)計(jì)第三版第章高級(jí)技巧中對(duì)高級(jí)定時(shí)器以及有較詳細(xì)的討論。至此,這類定時(shí)器函數(shù)已經(jīng)可以為所用了。 上一篇博文提到,在Node中timer并不是通過新開線程來(lái)實(shí)現(xiàn)的,而是直接在event loop中完成。下面通過幾個(gè)JavaScript的定時(shí)器示例以及N...
閱讀 3851·2021-09-27 13:56
閱讀 889·2021-09-08 09:36
閱讀 775·2019-08-30 15:54
閱讀 618·2019-08-29 17:29
閱讀 939·2019-08-29 17:21
閱讀 1695·2019-08-29 16:59
閱讀 2772·2019-08-29 13:03
閱讀 2975·2019-08-29 12:47