# before
# Description
创建一个调用 func
的函数,通过 this
绑定和创建函数的参数调用 func
,调用次数不超过 n
次。 之后再调用这个函数,将返回一次最后调用 func
的结果。
# Params
(n, func)
{Number} n: 超过多少次不再调用 func(注:限制调用 func 的次数)
{Function} func: 限制执行的函数
# Return
Function
-- 返回新的限定函数
# Code
function before(n, func) {
let result
if (typeof func !== 'function') {
throw new TypeError('Expected a function')
}
return function(...args) {
if (--n > 0) {
result = func.apply(this, args)
}
if (n <= 1) {
func = undefined
}
return result
}
}
# Analyze
- 首先判断如果传入的
func
不是一个Function
,则直接抛类型错误 - 定义 result 来存储每次执行的结果
- 函数在每次调用时,
n
都会递减,在n > 0
时,每次都会调用func
, 重新赋值result
,将result
返回 - 在
n <= 1
时,将func
置为undefined
(零引用) ,释放内存 - 在
n <= 0
时,将不在执行func
,只会返回 最后一次执行的结果
# Remark
- 闭包 MDN (opens new window)
- apply MDN (opens new window)
- 自减(--) MDN (opens new window)
- 剩余参数 MDN (opens new window)
- 内存管理 MDN (opens new window)
# Example
let a = 0
const _before = before(4, () => ++a)
_before() // 1
_before() // 2
_before() // 3
_before() // 3