# after
# Description
after
会返回一个函数,在调用这个函数 n
次后,会调用传入的 func
# Params
(n, func)
{Number} n: 次数
{Function} func: 回调的函数
# Return
Function
# Code
function after(n, func) {
if (typeof func !== 'function') {
throw new TypeError('Expected a function')
}
n = n || 0
return function(...args) {
if (--n < 1) {
return func.apply(this, args)
}
}
}
# Analyze
typeof func != 'function'
,如果传入的func
不是一个function
,则报错throw TypeError
- 返回一个函数,函数每次调用时都会进行
--n
的操作,并对n
判断,n < 1
时,则调用func.apply(this, args)
,func
的this
会绑定创建函数的this
# Remark
- 采用闭包的概念,抛出了
n
,每次函数调用都会改变n
的值 - call、apply、bind 的区别,用一句话总结就是,它们都是用来改变相关函数 this 的指向,但是 call 和 apply 是直接进行相关函数调用的;bind 不会执行相关函数,而是返回一个新的函数,这个新的函数已经自动绑定了新的 this 指向,开发者可以手动调用它。
- 闭包 MDN (opens new window)
- apply MDN (opens new window)
- call MDN (opens new window)
- call、apply、bind 区别 (opens new window)
- 剩余参数 MDN (opens new window)
# Example
const a = after(2,()=>{console.log(1)})
a()
a() // 1