javascript - 尾调用优化 (TCO) 在 Safari 中不起作用
问题描述
根据ES6 兼容性表,Safari 具有尾调用优化功能。试过了,它就像任何其他浏览器一样失败。我错过了什么吗?
function factorial(n, r = 1n) {
return (n <= 1) ? r : factorial(n - 1n, n * r)
}
console.log(factorial(36000n))
Safari 输出:
RangeError:超出最大调用堆栈大小。
解决方案
您需要在严格模式下运行程序。
"use strict";
function factorial(n, r = 1n) {
return n <= 1n ? r : factorial(n - 1n, n * r);
}
console.log(factorial(36000n).toString());
为了使函数调用被视为正确的尾调用,需要满足四个条件。
- 调用函数处于严格模式。
- 调用函数要么是普通函数,要么是箭头函数。
- 调用函数不是生成器函数。
- 被调用函数的返回值由调用函数返回。
资料来源:Michael Saboff 的 ECMAScript 6 Proper Tail Calls in WebKit
推荐阅读
- docker - 可以在 docker 容器中运行 Microsoft Office 应用程序吗?
- python-3.x - 如何从两个不同的列表中删除重复项?
- netty - netty 客户端重用服务器端引导程序导致请求永远不会完成
- javascript - rails 点击图片播放音频
- javascript - 闭包编译器和奇怪的前置代码
- android - 当用户安装应用程序时,不希望应用程序在主屏幕上创建它的图标
- arm64 - ARMv8 aarch64的对应asm代码
- python - 使用 Python 正则表达式抓取多个单词
- python - 输入用户数据时如何更新 Matplotlib 中的绘图(通过 PyQt5 按钮)
- node.js - 如何使用 People API 从 Google 联系人中获取所有(超过 2000 个)联系人