/**
 * @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 = 取消;

  返回去抖;
};