国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS進(jìn)階篇2---函數(shù)防抖(debounce)

zhongmeizhi / 2389人閱讀

摘要:函數(shù)防抖的要點(diǎn),是需要一個(gè)來(lái)輔助實(shí)現(xiàn),延遲運(yùn)行需要執(zhí)行的代碼。若計(jì)時(shí)期間事件沒(méi)有被重新觸發(fā),等延遲時(shí)間計(jì)時(shí)完畢,則執(zhí)行目標(biāo)代碼。而非立即執(zhí)行版指的是觸發(fā)事件后函數(shù)會(huì)立即執(zhí)行,然后秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果。。

JS中的函數(shù)防抖 一、什么是函數(shù)防抖

概念:函數(shù)防抖(debounce),就是指觸發(fā)事件后,在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果觸發(fā)事件后在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)延執(zhí)行時(shí)間。

舉個(gè)栗子,坐電梯的時(shí)候,如果電梯檢測(cè)到有人進(jìn)來(lái)(觸發(fā)事件),就會(huì)多等待 10 秒,此時(shí)如果又有人進(jìn)來(lái)(10秒之內(nèi)重復(fù)觸發(fā)事件),那么電梯就會(huì)再多等待 10 秒。在上述例子中,電梯在檢測(cè)到有人進(jìn)入 10 秒鐘之后,才會(huì)關(guān)閉電梯門(mén)開(kāi)始運(yùn)行,因此,“函數(shù)防抖”的關(guān)鍵在于,在 一個(gè)事件 發(fā)生 一定時(shí)間 之后,才執(zhí)行 特定動(dòng)作
二、為什么需要函數(shù)防抖

  前端開(kāi)發(fā)過(guò)程中,有一些事件,常見(jiàn)的例如,onresizescrollmousemove ,mousehover 等,會(huì)被頻繁觸發(fā)(短時(shí)間內(nèi)多次觸發(fā)),不做限制的話,有可能一秒之內(nèi)執(zhí)行幾十次、幾百次,如果在這些函數(shù)內(nèi)部執(zhí)行了其他函數(shù),尤其是執(zhí)行了操作 DOM 的函數(shù)(瀏覽器操作 DOM 是很耗費(fèi)性能的),那不僅會(huì)浪費(fèi)計(jì)算機(jī)資源,還會(huì)降低程序運(yùn)行速度,甚至造成瀏覽器卡死、崩潰。這種問(wèn)題顯然是致命的。

除此之外,短時(shí)間內(nèi)重復(fù)的 ajax 調(diào)用不僅會(huì)造成數(shù)據(jù)關(guān)系的混亂,還會(huì)造成網(wǎng)絡(luò)擁塞,增加服務(wù)器壓力,顯然這個(gè)問(wèn)題也是需要解決的。
三、函數(shù)防抖如何解決上述問(wèn)題

根據(jù)上面對(duì)問(wèn)題的分析,細(xì)細(xì)思索,可以想到如下解決方案。

函數(shù)防抖的要點(diǎn),是需要一個(gè) setTimeout 來(lái)輔助實(shí)現(xiàn),延遲運(yùn)行需要執(zhí)行的代碼。如果方法多次觸發(fā),則把上次記錄的延遲執(zhí)行代碼用 clearTimeout 清掉,重新開(kāi)始計(jì)時(shí)。若計(jì)時(shí)期間事件沒(méi)有被重新觸發(fā),等延遲時(shí)間計(jì)時(shí)完畢,則執(zhí)行目標(biāo)代碼。
四、函數(shù)防抖的代碼實(shí)現(xiàn)

根據(jù)以上分析,我們對(duì) “函數(shù)防抖” 來(lái)進(jìn)行簡(jiǎn)單的代碼實(shí)現(xiàn),如下:

function debounce(fn,wait){
    var timer = null;
    return function(){
        if(timer !== null){
            clearTimeout(timer);
        }
        timer = setTimeout(fn,wait);
    }
}
    
function handle(){
    console.log(Math.random());
}
    
window.addEventListener("resize",debounce(handle,1000));
以上代碼本人親測(cè)有效,小伙伴們可放心食用(注意,函數(shù)觸發(fā)方式為 “resize”,改變窗口大小,觀察瀏覽器控制臺(tái)的變化)。
五、函數(shù)節(jié)流的使用場(chǎng)景

函數(shù)防抖一般用在什么情況之下呢?一般用在,連續(xù)的事件只需觸發(fā)一次回調(diào)的場(chǎng)合。具體有:

搜索框搜索輸入。只需用戶最后一次輸入完,再發(fā)送請(qǐng)求;

用戶名、手機(jī)號(hào)、郵箱輸入驗(yàn)證;

瀏覽器窗口大小改變后,只需窗口調(diào)整完后,再執(zhí)行 resize 事件中的代碼,防止重復(fù)渲染。

目前遇到過(guò)的用處就是這些,理解了原理與實(shí)現(xiàn)思路,小伙伴可以把它運(yùn)用在任何需要的場(chǎng)合,提高代碼質(zhì)量。

總結(jié)

函數(shù)防抖其實(shí)是分為 “立即執(zhí)行版” 和 “非立即執(zhí)行版” 的,根據(jù)字面意思就可以發(fā)現(xiàn)他們的差別,所謂立即執(zhí)行版就是 觸發(fā)事件后函數(shù)不會(huì)立即執(zhí)行,而是在 n 秒后執(zhí)行,如果在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間。 而 “非立即執(zhí)行版” 指的是 觸發(fā)事件后函數(shù)會(huì)立即執(zhí)行,然后 n 秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果。

在開(kāi)發(fā)過(guò)程中,我們需要根據(jù)不同的場(chǎng)景來(lái)決定我們需要使用哪一個(gè)版本的防抖函數(shù),一般來(lái)講上述的防抖函數(shù)都能滿足大部分的場(chǎng)景需求。但我們也可以將非立即執(zhí)行版和立即執(zhí)行版的防抖函數(shù)結(jié)合起來(lái),實(shí)現(xiàn)最終的雙劍合璧版本的防抖函數(shù),以下為小伙伴們做了簡(jiǎn)單的實(shí)現(xiàn):

/**
 * @desc  函數(shù)防抖---“立即執(zhí)行版本” 和 “非立即執(zhí)行版本” 的組合版本
 * @param  func 需要執(zhí)行的函數(shù)
 * @param  wait 延遲執(zhí)行時(shí)間(毫秒)
 * @param  immediate---true 表立即執(zhí)行,false 表非立即執(zhí)行
 **/
function debounce(func,wait,immediate) {
    let timer;

    return function () {
        let context = this;
        let args = arguments;

        if (timer) clearTimeout(timer);
        if (immediate) {
            var callNow = !timer;
            timer = setTimeout(() => {
                timer = null;
            }, wait)
            if (callNow) func.apply(context, args)
        } else {
            timer = setTimeout(function(){
                func.apply(context, args)
            }, wait);
        }
    }
}

function handle(){
    console.log(Math.random());
}

// window.addEventListener("mousemove",debounce(handle,1000,true)); // 調(diào)用立即執(zhí)行版本
window.addEventListener("mousemove",debounce(handle,1000,false)); // 調(diào)用非立即執(zhí)行版本
此文所涉及到的代碼和知識(shí)點(diǎn)都進(jìn)行了仔細(xì)的調(diào)研、推敲,代碼可以直接使用,若有疑問(wèn)或者需要改正的地方,歡迎在下方評(píng)論區(qū)留言,本人將及時(shí)解答或者改正。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/105038.html

相關(guān)文章

  • JS進(jìn)階3---函數(shù)“節(jié)流” VS “防抖

    摘要:目的都是為了降低回調(diào)函數(shù)執(zhí)行頻率,節(jié)省計(jì)算機(jī)資源,優(yōu)化性能,提升用戶體驗(yàn)。函數(shù)防抖事件頻繁觸發(fā)的情況下,只有經(jīng)過(guò)足夠的空閑時(shí)間,才執(zhí)行代碼一次。 函數(shù)節(jié)流和函數(shù)防抖的對(duì)比分析 一、前言 前端開(kāi)發(fā)中,函數(shù)節(jié)流(throttle) 和 函數(shù)防抖(debounce) 作為常用的性能優(yōu)化方法,兩者都是用于優(yōu)化高頻率執(zhí)行 js 代碼的手段,那具體它們有什么異同點(diǎn)呢?有對(duì)這兩個(gè)概念不太了解的小伙伴...

    hlcc 評(píng)論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計(jì)篇,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫(xiě)一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...

    Maxiye 評(píng)論0 收藏0
  • [譯]通過(guò)實(shí)例講解Debouncing和Throtting(防抖與節(jié)流)

    摘要:譯通過(guò)實(shí)例講解和防抖與節(jié)流源碼中推薦的文章,為了學(xué)習(xí)英語(yǔ),翻譯了一下原文鏈接作者本文來(lái)自一位倫敦前端工程師的技術(shù)投稿。首次或立即你可能發(fā)現(xiàn)防抖事件在等待觸發(fā)事件執(zhí)行,直到事件都結(jié)束后它才執(zhí)行。 [譯]通過(guò)實(shí)例講解Debouncing和Throtting(防抖與節(jié)流) lodash源碼中推薦的文章,為了學(xué)習(xí)(英語(yǔ)),翻譯了一下~ 原文鏈接 作者:DAVID CORBACHO 本文來(lái)自一位...

    Jenny_Tong 評(píng)論0 收藏0
  • JavaScript專題之跟著underscore學(xué)防抖

    摘要:專題系列預(yù)計(jì)寫(xiě)二十篇左右,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究和的實(shí)現(xiàn)方式。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤剑?qǐng)務(wù)必給予指正,十分感謝。 JavaScript 專題系列第一篇,講解防抖,帶你從零實(shí)現(xiàn)一個(gè) underscore 的 debounce 函數(shù) 前言 在前端開(kāi)發(fā)中會(huì)遇到一些頻繁的事件觸發(fā),比如: window 的 r...

    sutaking 評(píng)論0 收藏0
  • Javascript 面試中經(jīng)常被問(wèn)到的三個(gè)問(wèn)題!

    摘要:相反,在討論時(shí),面試中通常會(huì)提到三件事。通過(guò)對(duì)事件對(duì)應(yīng)的回調(diào)函數(shù)進(jìn)行包裹以自由變量的形式緩存時(shí)間信息,最后用來(lái)控制事件的觸發(fā)頻率。而認(rèn)為最后一個(gè)參賽者說(shuō)了算,只要還能吃的,就重新設(shè)定新的定時(shí)器。 showImg(https://segmentfault.com/img/bVboH5x?w=1000&h=750); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 本...

    PrototypeZ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<