一个简单的函数式方法:
主意:
- 编写一个函数 myFunction(required, optional),其中可选参数位于最后,因此很容易处理。
- 使用函数 appendFirstArgumentIf() 从 myFunction 创建一个新函数 myNewFunction(optional, required)。
- 函数 appendFirstArgumentIf 调用 myFunction,如果它通过了 testfunction,则第一个参数移动到最后一个位置,否则它不会更改参数。
_
/**
* @param {function} fn(a,...b)
* @param {function} argumentTest - a function to test the first parameter
* @return {function} returns a function that passes its first argument into
argumentTest. If argumentTest returns true, fn is called with the first
argument shifted to the last position else fn is called with the arguments
order unchanged
*/
function appendFirstArgumentIf (fn,argumentTest){
return function(a,...b){
return argumentTest(a) ? fn(...b,a) : fn(a,...b)
}
}
用法:
function myFunction(callback, string){
string = string ? string : 'Default Message'
callback(string)
}
var myNewFunction = appendFirstArgumentIf(myFunction,
firstArgument=> typeof firstArgument !== 'function')
myNewFunction('New Message', console.log) // using console.log as callback function
//>>>New Message
myNewFunction(console.log)
//>>>Default Message
也可以这样:
function mySecondFunction(callback, name, string){
string = string ? string : 'Welcome'
callback(string, name)
}
var myLatestFunction = appendFirstArgumentIf(mySecondFunction,
firstArgument=> typeof firstArgument !== 'function')
myLatestFunction('Hello', console.log, 'John')
//>>>Hello John
myLatestFunction(console.log, 'John')
//>>>Welcome John