在某些情况下,函数式代码可能比与其等效的命令式代码更慢或消耗的内存更多。
可以利用交替组合子以及函数库(如Lodash)中提供的支持来实施延迟策略。
memoization(内部函数级缓存策略)可用于避免重复对潜在费时函数进行求值。
将程序分解成简单的函数不仅可以创建可拓展代码,还可以通过记忆化来使其更高效。
递归可以通过分解把问题化为更简单的自相似问题,继而充分利用记忆化优化上下文堆栈的使用。
将函数转换为尾递归形式,就可以借助编译器优化消除尾调用。
尾调用优化
ECMAScript6规范新增了一项内存管理优化机制,让JavaScript引擎在满足条件时可以重用栈帧。具体来说,这项优化非常适合尾调用。尾调用指的是函数作为另一个函数的最后一条语句被调用,比如:
1 | function outerFunction() { |
尾调用优化的条件就是确定外部栈帧真的没有必要存在了。涉及的条件如下:
- 代码在严格模式下执行
- 尾调用不访问当前栈帧的变量(也就是说函数不是一个闭包)
- 在函数内部,尾调用是最后一条语句
- 尾调用的结果作为函数值返回
递归函数是尾调用优化最主要的应用场景
考虑以下代码:
1 | function factorial(n) { |
尾调用优化后的版本:
1 | function factorial(n, p = 1) { |