gpt4 book ai didi

javascript - 为什么 Safari 会递归调用 function.apply?

转载 作者:行者123 更新时间:2023-11-29 09:54:41 24 4
gpt4 key购买 nike

考虑以下几点:

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 引擎的参数长度限制的潜在问题,但这里显然不是这种情况。

编辑:我仍然认为这不是参数长度问题。通过this page和我自己的测试,看起来 Safari 最多可以处理 524197 个参数,上面的代码没有超过。

奖励问题:我们可以重写上面的代码,通过在数组的每个元素上显式调用 String.fromCharCodejoin 来避免使用 apply > 将结果放在一起,但我怀疑那样会更慢(对于支持大输入 apply 的浏览器)。从整数字符代码数组组装大字符串的最佳方法是什么?

最佳答案

Apply 在某些浏览器中对其接受的参数长度有限制。 Webkit has an observed limit of 2^16 ,因此,如果您需要更多,您可能需要遵循一种策略来打破争论。如果您阅读错误的详细信息,它是一个强制限制,而不是递归引起的问题(有问题的错误也引发了类似的 RangeError)。

无论如何,我相信您对字符串连接的预感是正确的 - join 不一定像其他方法一样好。 Here's a test针对 string concat,我首先分解参数(类似于 MDN 对应用的讨论中的策略),并且它排在 join 之外。直接将字符串加在一起甚至排除了连接,这让我有点惊讶(至少在 chrome 中,我想他们必须有一些智能 gc 可以重用现有的字符串以产生很好的效果,但可以肯定地说).

编辑 - 有趣的是,就连接速度而言,Chrome 看起来很奇怪 - 对于所有其他浏览器,它在性能方面更接近 concat 甚至更好。

关于javascript - 为什么 Safari 会递归调用 function.apply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com