<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JS中setTimeout的巧妙用法前端函數(shù)節(jié)流

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 20:25:28
        文檔

        JS中setTimeout的巧妙用法前端函數(shù)節(jié)流

        JS中setTimeout的巧妙用法前端函數(shù)節(jié)流:什么是函數(shù)節(jié)流?函數(shù)節(jié)流簡單的來說就是不想讓該函數(shù)在很短的時間內(nèi)連續(xù)被調(diào)用,比如我們最常見的是窗口縮放的時候,經(jīng)常會執(zhí)行一些其他的操作函數(shù),比如發(fā)一個ajax請求等等事情,那么這時候窗口縮放的時候,有可能連續(xù)發(fā)多個請求,這并不是我們想要的,或者
        推薦度:
        導讀JS中setTimeout的巧妙用法前端函數(shù)節(jié)流:什么是函數(shù)節(jié)流?函數(shù)節(jié)流簡單的來說就是不想讓該函數(shù)在很短的時間內(nèi)連續(xù)被調(diào)用,比如我們最常見的是窗口縮放的時候,經(jīng)常會執(zhí)行一些其他的操作函數(shù),比如發(fā)一個ajax請求等等事情,那么這時候窗口縮放的時候,有可能連續(xù)發(fā)多個請求,這并不是我們想要的,或者

        什么是函數(shù)節(jié)流?

        函數(shù)節(jié)流簡單的來說就是不想讓該函數(shù)在很短的時間內(nèi)連續(xù)被調(diào)用,比如我們最常見的是窗口縮放的時候,經(jīng)常會執(zhí)行一些其他的操作函數(shù),比如發(fā)一個ajax請求等等事情,那么這時候窗口縮放的時候,有可能連續(xù)發(fā)多個請求,這并不是我們想要的,或者是說我們常見的鼠標移入移出tab切換效果,有時候連續(xù)且移動的很快的時候,會有閃爍的效果,這時候我們就可以使用函數(shù)節(jié)流來操作。大家都知道,DOM的操作會很消耗或影響性能的,如果是說在窗口縮放的時候,為元素綁定大量的dom操作的話,會引發(fā)大量的連續(xù)計算,比如在IE下,過多的DOM操作會影響瀏覽器性能,甚至嚴重的情況下,會引起瀏覽器崩潰的發(fā)生。這個時候我們就可以使用函數(shù)節(jié)流來優(yōu)化代碼了~

        函數(shù)節(jié)流的基本原理:

        使用一個定時器,先延時該函數(shù)的執(zhí)行,比如使用setTomeout()這個函數(shù)延遲一段時間后執(zhí)行函數(shù),如果在該時間段內(nèi)還觸發(fā)了其他事件,我們可以使用清除方法 clearTimeout()來清除該定時器,再setTimeout()一個新的定時器延遲一會兒執(zhí)行。

        最近在某團隊忙于一個項目,有這么一個頁面,采用傳統(tǒng)模式開發(fā)(吐槽它為什么不用React),它的DOM操作比較多,然后性能是比較差的,尤其當你縮放窗口時,可怕的事情發(fā)生了,出現(xiàn)了卡頓,甚至瀏覽器癱瘓。為什么呢?

        由于該頁面的DOM操作非常多,故窗口縮放每一幀時都會觸發(fā)函數(shù)的執(zhí)行,連續(xù)的重新DOM操作,這樣對瀏覽器的開銷是非常大的。既然在窗口縮放時,會讓瀏覽器重新計算DOM,那么我們?yōu)槭裁床豢梢宰孌OM的計算延時呢,讓窗口停止縮放后才重新計,這樣不就節(jié)省了瀏覽器的開銷,達到優(yōu)化的效果了嗎?

        知識準備

        1. setTimeout(code,millisec) 當然就是本文的主角了。

        setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計算表達式。

        code必需。要調(diào)用的函數(shù)后要執(zhí)行的 JavaScript 代碼串。

        millisec必需。在執(zhí)行代碼前需等待的毫秒數(shù)。

        提示:setTimeout() 只執(zhí)行 code 一次。如果要多次調(diào)用,請使用 setInterval() 或者讓 code 自身再次調(diào)用 setTimeout()。

        廣泛應用于定時器,輪播圖,動畫效果,自動滾動等等。

        2. clearTimeout(id_of_setTimeout)

        參數(shù) id_of_settimeout由 setTimeout() 返回的 ID 值。該值標識要取消的延遲執(zhí)行代碼塊。

        3. fun.apply(thisArg[, argsArray])

        apply() 方法在指定 this 值和參數(shù)(參數(shù)以數(shù)組或類數(shù)組對象的形式存在)的情況下調(diào)用某個函數(shù)

        該函數(shù)的語法與call()方法幾乎相同,唯一的區(qū)別在于,call()方法接受的是一個參數(shù)列表,而apply()接受的是一個包含多個參數(shù)數(shù)組的(或類數(shù)組對象)。

        參數(shù)

        thisArg

        在 fun 函數(shù)運行時指定的 this 值。需要注意的是,指定的 this 值并不一定是該函數(shù)執(zhí)行時真正的 this 值,如果這個函數(shù)處于非嚴格模式下,則指定為 null 或 undefined 時會自動指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象。

        argsArray

        一個數(shù)組或者類數(shù)組對象,其中的數(shù)組元素將作為單獨的參數(shù)傳給 fun 函數(shù)。如果該參數(shù)的值為null 或 undefined,則表示不需要傳入任何參數(shù)。從ECMAScript 5 開始可以使用類數(shù)組對象。

        在調(diào)用一個存在的函數(shù)時,你可以為其指定一個 this 對象。 this 指當前對象,也就是正在調(diào)用這個函數(shù)的對象。 使用 apply, 你可以只寫一次這個方法然后在另一個對象中繼承它,而不用在新對象中重復寫該方法。

        4. fun.call(thisArg[, arg1[, arg2[, ...]]])

        該 方法在使用一個指定的this值和若干個指定的參數(shù)值的前提下調(diào)用某個函數(shù)或方法.

        參數(shù)

        thisArg

        在fun函數(shù)運行時指定的this值。需要注意的是,指定的this值并不一定是該函數(shù)執(zhí)行時真正的this值,如果這個函數(shù)處于非嚴格模式下,則指定為null和undefined的this值會自動指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的this會指向該原始值的自動包裝對象。

        arg1, arg2, ...

        指定的參數(shù)列表。

        當調(diào)用一個函數(shù)時,可以賦值一個不同的 this 對象。this 引用當前對象,即 call 方法的第一個參數(shù)。通過 call 方法,你可以在一個對象上借用另一個對象上的方法,比如Object.prototype.toString.call([]),就是一個Array對象借用了Object對象上的方法。

        作用:

        使用call方法調(diào)用父構(gòu)造函數(shù)

        使用call方法調(diào)用匿名函數(shù)

        使用call方法調(diào)用匿名函數(shù)并且指定上下文的'this'

        這里插個題外話:

        apply 與 call() 非常相似,不同之處在于提供參數(shù)的方式。apply 使用參數(shù)數(shù)組而不是一組參數(shù)列表。apply 可以使用數(shù)組字面量(array literal),如 fun.apply(this, ['eat', 'bananas']),或數(shù)組對象, 如 fun.apply(this, new Array('eat', 'bananas'))。你也可以使用 arguments 對象作為 argsArray 參數(shù)。 arguments 是一個函數(shù)的局部變量。 它可以被用作被調(diào)用對象的所有未指定的參數(shù)。 這樣,你在使用apply函數(shù)的時候就不需要知道被調(diào)用對象的所有參數(shù)。 你可以使用arguments來把所有的參數(shù)傳遞給被調(diào)用對象。 被調(diào)用對象接下來就負責處理這些參數(shù)。

        從 ECMAScript 第5版開始,可以使用任何種類的類數(shù)組對象,就是說只要有一個 length 屬性和[0...length) 范圍的整數(shù)屬性。例如現(xiàn)在可以使用 NodeList 或一個自己定義的類似 {'length': 2, '0': 'eat', '1': 'bananas'} 形式的對象。

        call, apply方法區(qū)別是,從第二個參數(shù)起, call方法參數(shù)將依次傳遞給借用的方法作參數(shù), 而apply 直接將這些參數(shù)放到一個數(shù)組中再傳遞, 最后借用方法的參數(shù)列表是一樣的.

        應用場景:當參數(shù)明確時可用call, 當參數(shù)不明確時可用apply給合arguments

        現(xiàn)在先給出一個例子

        總所皆知,onscolll,onresize等是非常耗性能,窗口縮放時打印數(shù)字。

        var count = ;
        window.onresize = function () {
        count++;
        console.log(count);
        }

        在chrome瀏覽器中伸縮瀏覽器窗口大小,打印如下

        這顯然不是我們想要的,那如果我們換成ajax請求的話,那么就會縮放一次窗口會連續(xù)觸發(fā)多次ajax請求,下面我們試著使用函數(shù)節(jié)流的操作試試一下;當然加個settimeout()的定時器就好了,

        第一種封裝方法

        var count = ;
        function oCount() {
        count++;
        console.log(count);
        }
        window.onresize = function () {
        delayFun(oCount)
        };
        function delayFun(method, thisArg) {
        clearTimeout(method.props);
        method.props = setTimeout(function () {
        method.call(thisArg)
        }, )
        }

        第二種封裝方法

        構(gòu)造一個閉包,使用閉包的方式形成一個私有的作用域來存放定時器timer, timer是通過傳參數(shù)的形式引入的。

        var count = ;
        function oCount() {
        count++;
        console.log(count);
        }
        var funs= delayFun(oCount,);
        window.onresize = function () {
        funs()
        };
        function delayFun(func, wait) {
        var timer = null;
        return function () {
        var context = this,
        args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function () {
        func.apply(context, args);
        }, wait)
        };
        }

        對第二種方法優(yōu)化一下,性能會更好

        這里返回一個函數(shù),如果它被不間斷地調(diào)用,它將不會得到執(zhí)行。該函數(shù)在停止調(diào)用 N 毫秒后,再次調(diào)用它才會得到執(zhí)行。如果有傳遞 ‘immediate' 參數(shù),會馬上將函數(shù)安排到執(zhí)行隊列中,而不會延遲。

        function delayFun (func, wait, immediate) {
        var timeout;
        return function() {
        var context = this, args = arguments;
        var later = function() {
        timeout = null;
        if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
        };
        };
        // 用法
        var myEfficientFn = delayFun (function() {
        // 所有繁重的操作
        }, );
        window.addEventListener('resize', myEfficientFn);

        函數(shù)不允許回調(diào)函數(shù)在指定時間內(nèi)執(zhí)行多于一次。當為一個會頻繁觸發(fā)的事件分配一個回調(diào)函數(shù)時,該函數(shù)顯得尤為重要。

        setTimeout這么厲害,那么我們是可以在項目中大量使用嗎?

        我個人是不建議的,在我們業(yè)務中,基本上是禁止在業(yè)務邏輯中使用setTimeout的,因為我所看到的很多使用方式都是一些問題好解決,setTimeout作為一個hack的方式。

        例如,當一個實例還沒有初始化的前,我們就使用這個實例,錯誤的解決辦法是使用實例時加個setTimeout,確保實例先初始化。

        為什么錯誤?這里其實就是使用hack的手段

        第一是埋下了坑,打亂模塊的生命周期

        第二是出現(xiàn)問題時,setTimeout其實是很難調(diào)試的。

        有關(guān)JS中setTimeout的巧妙用法前端函數(shù)節(jié)流,小編就給大家介紹到這里,希望對大家有所幫助!

        更多JS中setTimeout的巧妙用法前端函數(shù)節(jié)流相關(guān)文章請關(guān)注PHP中文網(wǎng)!

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JS中setTimeout的巧妙用法前端函數(shù)節(jié)流

        JS中setTimeout的巧妙用法前端函數(shù)節(jié)流:什么是函數(shù)節(jié)流?函數(shù)節(jié)流簡單的來說就是不想讓該函數(shù)在很短的時間內(nèi)連續(xù)被調(diào)用,比如我們最常見的是窗口縮放的時候,經(jīng)常會執(zhí)行一些其他的操作函數(shù),比如發(fā)一個ajax請求等等事情,那么這時候窗口縮放的時候,有可能連續(xù)發(fā)多個請求,這并不是我們想要的,或者
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人激情免费视频| 国产亚洲sss在线播放| 国产成人精品免费直播 | 免费大黄网站在线观| 19禁啪啪无遮挡免费网站| 精品视频在线免费观看| 一级成人a做片免费| 亚洲另类无码专区首页| 亚洲一级免费毛片| 久久精品国产亚洲AV电影| 亚洲精品高清无码视频| 亚洲精品NV久久久久久久久久| 在线成人a毛片免费播放| 精品国产无限资源免费观看| 日本不卡免费新一区二区三区| ww在线观视频免费观看w| 欧洲美女大片免费播放器视频| 亚洲AV无码成人精品区狼人影院 | 国产免费拔擦拔擦8X高清在线人 | 亚洲日本乱码在线观看| 亚洲国产成人VA在线观看| 四虎影在线永久免费四虎地址8848aa | 日本中文字幕免费高清视频| 成人网站免费大全日韩国产| 一区视频免费观看| 美女视频黄视大全视频免费的| 亚洲爆乳精品无码一区二区| 亚洲人成色777777老人头| 国产成人精品日本亚洲直接| 久久亚洲精品国产亚洲老地址| 亚洲一级毛片中文字幕| 亚洲av永久无码嘿嘿嘿| 国产成人亚洲合集青青草原精品| 亚洲久悠悠色悠在线播放| 亚洲男人天堂2018av| 亚洲中文字幕一区精品自拍| 亚洲精品国产suv一区88| 蜜芽亚洲av无码一区二区三区| 国产亚洲精品91| xxxxx做受大片视频免费| a级毛片在线视频免费观看|