有一组需要执行乘法的数字数组:
var nums = [1, 2, 3, null, 5];
_.reduce(nums, function(total, n) { return total * n })
// => 0
如果有一个fnull函数,接收一个函数和额外的参数,返回一个只是调用给定的原始函数的函数。 对于任何事null或者是undefined的参数,都用原来默认的参数来替代。
function fnull(fun /*, defaults */) {
var defaults = _.rest(arguments);
console.log(defaults)
return function(/* args */) {
var args = _.map(arguments, function(e, i) {
console.log(e, i)
return !!e ? e : defaults[i];
})
return fun.apply(null, args);
}
}
var safeMult = fnull(function(total, n) { return total * n }, 1, 1);
_.reduce(nums, safeMult);
fnull
只有在守卫函数被调用的时候,用来比哪一默认值的成本才会生成,分配默认值是以懒惰方式完成。
var safeMult = fnull(total, n) { return total * n }, 1, 1);
_.reduce(nums, safeMult);
//=> 30
在没有给出参数是得到一个确定值。
function defaults(defaultConfig) {
return function(object, key) {
var valFun = fnull(_.identity, defaultConfig[key])
// valFun, if object[key] is falsy, then using defaultConfig[key] as defualt value
return object && valFun(object[key]);
}
}
function doSomeThing(config) {
var lookup = defaults({critical : 109});
return lookup(config, 'critical');
}
doSomeThing({critical : 9}) //=> 9
doSomeThing({}); //=> 109