Folia
← 返回头版

递归在JavaScript中的隐藏风险

JavaScript开发者需要警惕递归函数在生产环境中的潜在威胁。虽然递归在逻辑正确且基础情况完善时在理论上看似安全,但每次递归调用都会消耗栈空间,最终导致栈溢出1。以一个简单的求和函数为例,sum(100000) 在大多数JavaScript运行时会直接抛出 RangeError 或 InternalError: too much recursion 错误1。

尾递归优化(TCO)被寄予厚望作为解决方案,但实际情况令人失望1。虽然ECMAScript 2015在正式规范中确立了严格模式下的适当尾调用机制,但大多数JavaScript引擎并未一致采纳这一特性1。这导致一个关键问题:尾递归是函数结构的属性,而栈重用则是运行时实现的属性1。即使代码在结构上符合尾递归的要求,也不能保证在生产环境中不会失败。

对此,业界给出了务实的建议1。对于小的、有界的递归深度场景,可以安全使用递归;但对于深度由用户驱动、数据驱动或操作不确定的场景,应该改用迭代方法1。此外,蹦床模式(trampoline)提供了一个替代方案——在保持递归结构可读性的同时避免栈增长1。


来源

  1. Hacker NewsRecursion is lying to you

评论