Skip to content

Latest commit

 

History

History
60 lines (45 loc) · 1.52 KB

4.2.3-高阶函数-防止不存在的函数.md

File metadata and controls

60 lines (45 loc) · 1.52 KB

有一组需要执行乘法的数字数组:

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