# 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

  1. 首先判断如果传入的 func 不是一个 Function ,则直接抛类型错误
  2. 定义 result 来存储每次执行的结果
  3. 函数在每次调用时, n 都会递减,在 n > 0 时,每次都会调用 func , 重新赋值 result,将 result 返回
  4. n <= 1 时,将 func 置为 undefined(零引用) ,释放内存
  5. n <= 0 时,将不在执行 func ,只会返回 最后一次执行的结果

# Remark

  1. 闭包 MDN (opens new window)
  2. apply MDN (opens new window)
  3. 自减(--) MDN (opens new window)
  4. 剩余参数 MDN (opens new window)
  5. 内存管理 MDN (opens new window)

# Example

let a = 0
const _before = before(4, () => ++a)

_before() // 1
_before() // 2
_before() // 3
_before() // 3