高阶函数

2018-10-02  本文已影响11人  EdmundChen

高阶函数定义:

高阶函数捕获参数

为啥需要创建一个以函数为返回值的函数?

高阶函数的参数是用来“配置”返回函数的行为的。
eg: makeAdder, 它参数配置了其返回函数每次添加数值的大小

var add100 = makeAdder(100);
add100(40) // => 140

通过将函数makeAdder的返回函数命名为add100, 这里特别强调了返回函数是如何被"配置"的。 这是非常有用的,但其能力有限。不同的是, 经常会看到一个函数返回一个捕获变量的函数。

捕获变量的好处

假如需要一个生产唯一字符串的函数

function uniqueString(len) {
  return Math.random().toString(36).substr(2, len);
}
uniqueString(10); // => '3rms32dsx'

然而,如果要生成具有特定前缀的唯一字符串,怎么办? 可将uniqueString修改为

function uniqueString(prefix) {
  return [prefix, new Date().getTIme()].join('');
};
uniqueString('test')
uniqueString(10); // => 'test3rms32dsx'

如果需要再次变更, 需要返回一个添加了前缀,并且从某一个值开始增长的字符串,这种情况下,上述方法就不行了。 具体效果如下

uniqueString('ghosts'); // => 'ghosts0'
uniqueString('test'); // => 'test1'

实现如下

function makeUniqueStringFunction(start) {
   let count = start;
  return (prefix)=>[prefix, count++].join('');
}
var uniqueString = makeUniqueStringFunction(0);

uniqueString('ghosts'); // => 'ghosts0'
uniqueString('test'); // => 'test1'

makeUniqueStringFunction 使用了conut的变量来追踪当前值。 虽然对于外界操作来说,该变量是安全的, 但是它的存在会增加复杂度,当一个函数的返回值只依赖于它的参数时, 被称为:引用透明。 实际当中我们应该尽量避免这样的函数, 除非他们是绝对必要的。

上一篇 下一篇

猜你喜欢

热点阅读