BFE.devでのAI解答例 - JavaScript コーディング問題
5. leading & trailingをサポートするthrottle() を実装する
以下は、leadingとtrailingのオプションを持つthrottle()の実装例です。
function throttle(func, wait, options = { leading: true, trailing: true }) { let context, args, result let timeout = null let previous = 0 const { leading, trailing } = options const later = () => { previous = leading ? Date.now() : 0 timeout = null result = func.apply(context, args) if (!timeout) context = args = null } const throttled = function (...rest) { const now = Date.now() if (!previous && !leading) previous = now const remaining = wait - (now - previous) context = this args = rest if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout) timeout = null } previous = now result = func.apply(context, args) if (!timeout) context = args = null } else if (!timeout && trailing) { timeout = setTimeout(later, remaining) } return result } throttled.cancel = function () { clearTimeout(timeout) previous = 0 timeout = context = args = null } return throttled}