考虑以下:
var foo = []
for (var i=0; i<100000; i++) { foo.push(97); }
var bar = String.fromCharCode.apply(String,foo)
大多数浏览器运行良好,但 Safari 会抛出:RangeError: Maximum call stack size exceeded.
基于此,Safari 对Function.prototype.apply的实现似乎是递归的。这是真的?
上面链接的 MDN 页面提到了 JS 引擎的参数长度限制的潜在问题,但这里显然不是这种情况。
编辑:我仍然认为这不是参数长度问题。通过这个页面和我自己的测试,看起来 Safari 最多可以处理 524197 个参数,上面的代码没有超过。
额外的问题:我们可以重写上面的代码以避免使用 apply 通过显式调用String.fromCharCode
数组的每个元素join
并将结果放在一起,但我怀疑这会更慢(对于支持 large-input 的浏览器apply
)。从整数字符代码数组组装大字符串的最佳方法是什么?