摘要:函數(shù)節(jié)流背景中的函數(shù)大多數(shù)情況下都是由用戶主動調(diào)用觸發(fā)的除非是函數(shù)本身的實現(xiàn)不合理否則一般不會遇到跟性能相關(guān)的問題但在少數(shù)情況下函數(shù)的觸發(fā)不是由用戶直接控制的在這些場景下函數(shù)可能被非常頻繁調(diào)用而造成大的性能問題場景事件事件滾動事件共同的特征
函數(shù)節(jié)流 背景
javascript中的函數(shù)大多數(shù)情況下都是由用戶主動調(diào)用觸發(fā)的, 除非是函數(shù)本身的實現(xiàn)不合理, 否則一般不會遇到跟性能相關(guān)的問題,但在少數(shù)情況下, 函數(shù)的觸發(fā)不是由用戶直接控制的. 在這些場景下, 函數(shù)可能被非常頻繁調(diào)用, 而造成大的性能問題.
場景window.onresize事件
mousemove事件
scroll滾動事件
共同的特征:高頻觸發(fā)事件函數(shù), 若事件函數(shù)里附帶DOM相關(guān)操作, 會造成非常大的性能消耗.
將即將被執(zhí)行的函數(shù)使用setTimeout延遲一段時間執(zhí)行, 如果該次延遲執(zhí)行還沒有完成, 則忽略接下來調(diào)用該函數(shù)的請求.
實現(xiàn) 示例1underscore.js的函數(shù)節(jié)流定義: _.throttle(fn, wait, [options]);
_.throttle接收三個參數(shù), 第一次執(zhí)行默認(rèn)立刻執(zhí)行一次fn @params fn: 需要進(jìn)行函數(shù)節(jié)流的函數(shù); @params wait: 函數(shù)執(zhí)行的時間間隔, 單位是毫秒. @params options: options有兩個選項, 分別是: {leading: false}: 第一次調(diào)用不執(zhí)行fn {trailing: false}: 禁止最后一次延遲的調(diào)用 _.throttle = function(fn, wait, options) { var context, args, result, timeout = null, previous = 0; if(!options) { options = {}; } var later = function() { previous = options.leading === false ? 0 : _.now(); timeout = null; result = fn.apply(context, args); if(!timeout) { context = args = null; } }; return function() { var now = _.now(); if(!previous && options.leading === false) { previous = now; } var remaining = wait - (now - previous); context = this; args = arguments; if(remaining <= 0 || remaining > wait) { if(timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = fn.apply(context, args); if(!timeout) { context = args = null; } else if(!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; } }; }; // demo: $(window).scroll(_.throttle(function() { //相關(guān)處理 }, 500));示例2
《javascript設(shè)計模式與開發(fā)實戰(zhàn)》中對函數(shù)節(jié)流示例:
throttle函數(shù)接收兩個參數(shù) @params fn: 需要被延遲執(zhí)行的函數(shù); @params interval: 延遲執(zhí)行的時間; var throttle = function(fn, interval) { var _self = fn, // 保存需要被延遲執(zhí)行的函數(shù)引用 timer, // 計時器 firstTime = true; // 是否第一次調(diào)用 return function() { var args = arguments, _this = this; if(firstTime) { // 如果是第一次調(diào)用, 不需要延遲執(zhí)行 _self.apply(_this, args); return firstTime = false; } if(timer) { // 如果定時器還在, 說明前一次延遲執(zhí)行還未完成 return false; } timer = setTimeout(function() { clearTimeout(timer); timer = null; _self.apply(_this, args); }, interval || 500); }; }; // demo: window.onresize = throttle(function() { console.log(1); }, 500);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80188.html
摘要:函數(shù)防抖場景假設(shè)網(wǎng)站有個搜索框用戶輸入文本我們會自動聯(lián)想匹配出一些結(jié)果供用戶選擇我們可能首先想到的做法就是監(jiān)聽事件然后異步查詢結(jié)果但是如果用戶快速的輸入了一串字符假設(shè)是個字符那么就會在瞬間觸發(fā)次請求這無疑不是我們想要的我們想要的是用戶停止輸 函數(shù)防抖 場景 假設(shè)網(wǎng)站有個搜索框, 用戶輸入文本我們會自動聯(lián)想匹配出一些結(jié)果供用戶選擇,我們可能首先想到的做法就是監(jiān)聽keypress事件, 然...
摘要:首屏渲染優(yōu)化背景一個龐大的頁面有時我們并不會滾動去看下面的內(nèi)容這樣就造成了非首屏部分的渲染這些無用的渲染不僅包括圖片還包括其他元素甚至一些某些根據(jù)模塊請求比如理論上每增加一個都會增加渲染的時間并且影響著頁面打開的加載速度這時就需要一種辦法使 BigRender首屏渲染優(yōu)化 背景 一個龐大的頁面, 有時我們并不會滾動去看下面的內(nèi)容, 這樣就造成了非首屏部分的渲染, 這些無用的渲染不僅包括...
摘要:已經(jīng)超出本地存儲限定大小可進(jìn)行超出限定大小之后的操作,如下面可以先清除記錄,再次保存面試官一波素質(zhì)三連對于只是會使用的同學(xué)來說,肯定是不得其解的。 最近面試的時候關(guān)于html5API總會被問到localStorage的問題, 對于一般的問題很簡單,無非就是 localStorage、sessionStorage和cookie這三個客戶端緩存的區(qū)別 localStorage的API,g...
摘要:一直使用定義變量,的出現(xiàn)給變量定義增加了兩個大將,。聲明的變量,塊作用域,不重復(fù)聲明覆蓋,限制了變量的作用域,保證變量不會去污染全局變量,所以盡量將改為用。 一直使用var定義變量,ES6的出現(xiàn)給變量定義增加了兩個大將let,const。那它們有什么區(qū)別呢。 1、const關(guān)鍵字它的作用就是定義一個常量,一旦定義無法更改,不能重復(fù)聲明覆蓋; showImg(https://segmen...
摘要:科普一下什么是時區(qū)眾所周知地球繞著太陽轉(zhuǎn)的同時也會自轉(zhuǎn)因此同一時刻不同地區(qū)所接收到太陽照射的情況不同所以有的地區(qū)是日出有的地區(qū)是日落還有的地區(qū)可能是黑夜既然地球上的不同地區(qū)時間不同那總要有統(tǒng)一的時間刻度才能方便文化科技交流吧不然大家說的都是 科普一下什么是時區(qū) 眾所周知,地球繞著太陽轉(zhuǎn)的同時也會自轉(zhuǎn),因此同一時刻不同地區(qū)所接收到太陽照射的情況不同,所以有的地區(qū)是日出,有的地區(qū)是日落,還...
閱讀 990·2021-09-26 10:15
閱讀 2072·2021-09-24 10:37
閱讀 2584·2019-08-30 13:46
閱讀 2635·2019-08-30 11:16
閱讀 2424·2019-08-29 10:56
閱讀 2595·2019-08-26 12:24
閱讀 3479·2019-08-23 18:26
閱讀 2665·2019-08-23 15:43