/**
* @file fn.js
* @module fn
*/
從'./guid.js'導入{newGUID};
從“全局/窗口”導入窗口;
導出常量 UPDATE_REFRESH_INTERVAL = 30;
/**
* 綁定(又名代理或上下文)。改變上下文的簡單方法
* 一個函數。
*
* 它還在函數上存儲了一個唯一的 id,因此可以很容易地從中刪除它
* 事件。
*
* @功能
* @param {混合} 上下文
* 作為作用域綁定的對象。
*
* @param {函數} fn
* 要綁定到範圍的函數。
*
* @param {number} [uid]
* 要設置的功能的可選唯一 ID
*
* @return {函數}
* 將綁定到給定上下文中的新函數
*/
export const bind = function(context, fn, uid) {
// 確保函數有一個唯一的 ID
如果(!fn.guid){
fn.guid = newGUID();
}
// 創建改變上下文的新函數
const bound = fn.bind(上下文);
// 允許個性化此功能
// 在多個對象可能共享同一個原型的情況下需要
// 如果兩個項目都添加了一個具有相同功能的事件偵聽器,那麼您嘗試只刪除一個
// 它將刪除兩者,因為它們都有相同的 guid。
// 使用這個時,在移除監聽器時也需要使用 bind 方法。
// 當前用於文本軌道
bound.guid = (uid) ? uid + '_' + fn.guid : fn.guid;
返回綁定;
};
/**
* 用一個只調用 `fn` 的新函數包裝給定的函數 `fn`
* 每 `wait` 毫秒最多一次。
*
* @功能
* @param {函數} fn
* 被限制的功能。
*
* @param {number} 等待
* 節流的毫秒數。
*
* @return {函數}
*/
export const throttle = function(fn, wait) {
讓 last = window.performance.now();
const throttled = function(...args) {
const now = window.performance.now();
如果(現在 - 最後> =等待){
fn(...參數);
最後=現在;
}
};
返回節流;
};
/**
* 創建一個去抖函數,延遲調用 `func` 直到 `wait` 之後
* 自上次 debounced 函數運行以來經過的毫秒數
* 調用。
*
* 受 lodash 和下劃線實現的啟發。
*
* @功能
* @param {函數} 函數
* 用去抖動行為包裝的函數。
*
* @param {number} 等待
* 最後一次調用後等待的毫秒數。
*
* @param {boolean} [立即]
* 是否在創建後立即調用函數。
*
* @param {對象} [上下文=窗口]
* 去抖動函數應該去抖動的“上下文”。為了
* 例如,如果此函數應綁定到 Video.js 播放器,
* 玩家可以通過這裡。或者,默認為
* 全局“窗口”對象。
*
* @return {函數}
* 去抖功能。
*/
export const debounce = function(func, wait, immediate, context = window) {
讓超時;
const 取消 = () => {
context.clearTimeout(超時);
超時=空;
};
/* eslint-disable consistent-this */
const debounced = function() {
常量自我=這個;
常量參數 = 參數;
讓以後=功能(){
超時=空;
後來=空;
如果(!立即){
func.apply(self, args);
}
};
如果(!超時&&立即){
func.apply(self, args);
}
context.clearTimeout(超時);
timeout = context.setTimeout(稍後,等待);
};
/* eslint-enable consistent-this */
debounced.cancel = 取消;
返回去抖;
};