91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析JS函數的防抖和節流

發布時間:2021-12-14 14:21:16 來源:億速云 閱讀:144 作者:柒染 欄目:互聯網科技

如何分析JS函數的防抖和節流,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

節流實質上是:如果你持續觸發事件,每隔一段時間,只執行一次事件。

根據這個需求我們可以通過時間戳實現節流:

//第一個實現方式function throttle(func, wait) {
    var context, args;
    var previous = 0;
    return function() {
        var now = +new Date();
        context = this;
        args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }}//另外補充一下獲取時間戳的方式吧// new Date().getTime()// Date.parse(new Date())// +new Date()// Date.now()// 通過判斷再次點擊時間與上次點擊時間的時間戳是否大于傳入的時間,來判斷函數是否被執行

另一種實現方式通過定時器,通過判斷定時器的存在來決定函數是否被執行

// 第二種實現方式function throttle(func, wait) {
    var timeout;
    var previous = 0;

    return function() {
        context = this;
        args = arguments;
        if (!timeout) {
            timeout = setTimeout(function(){
                timeout = null;
                func.apply(context, args)
            }, wait)
        }

    }}//

看上面兩種實現方式的代碼,比較可以發現:

  1. 方式一的事件會立刻執行,因為獲取當前時間戳肯定會大于wait傳入的時間,方式二事件會在 n 秒后第一次執行,因為設置了定時器,所以會在wait秒之后執行。

  2. 如果我們連續執行了幾次,第一種方式會在事件結束之后不會再執行函數,第二種會在結束之后wait秒之后再執行一次。

怎么中和實現一下兩種方式呢?

// 第三種方式function throttle(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
        previous = options.leading === false ? 0 : new Date().getTime();
        timeout = null;
        func.apply(context, args);
        if (!timeout) context = args = null;
    };
    var throttled = function() {
        var now = new Date().getTime();
        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;
            func.apply(context, args);
            if (!timeout) context = args = null;
        } else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining);
        }
    };
    return throttled;}
//leading:false 表示禁用第一次執行
//trailing: false 表示禁用停止觸發的回調
//那就是 leading:false 和 trailing: false 不能同時設置。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

三亚市| 凯里市| 红桥区| 土默特右旗| 乌拉特前旗| 太和县| 泰顺县| 无极县| 尼勒克县| 龙陵县| 襄樊市| 峡江县| 伊吾县| 枣庄市| 台东市| 宁陵县| 岚皋县| 蓬莱市| 额济纳旗| 永春县| 琼海市| 景谷| 定南县| 从化市| 东安县| 兴业县| 延吉市| 邵武市| 墨玉县| 勐海县| 涿鹿县| 邢台市| 广平县| 康乐县| 留坝县| 班戈县| 嘉祥县| 梅河口市| 阿克苏市| 太白县| 大石桥市|