高阶函数定义:
- 以一个函数作为参数
- 以一个函数作为返回结果
高阶函数捕获参数
为啥需要创建一个以函数为返回值的函数?
高阶函数的参数是用来“配置”返回函数的行为的。
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的变量来追踪当前值。 虽然对于外界操作来说,该变量是安全的, 但是它的存在会增加复杂度,当一个函数的返回值只依赖于它的参数时, 被称为:引用透明。 实际当中我们应该尽量避免这样的函数, 除非他们是绝对必要的。