Javascript 为什么Safari调用function.apply递归?
考虑以下几点:Javascript 为什么Safari调用function.apply递归?,javascript,safari,Javascript,Safari,考虑以下几点: var foo = [] for (var i=0; i<100000; i++) { foo.push(97); } var bar = String.fromCharCode.apply(String,foo) var foo=[] for(var i=0;iApply在某些浏览器中对其接受的参数长度有限制。因此,如果您需要更多参数,您可能希望遵循一种策略来分解参数。如果您阅读了错误的详细信息,这是一个强制限制,而不是递归引起的问题(有问题的bug也抛出了类似的Ran
var foo = []
for (var i=0; i<100000; i++) { foo.push(97); }
var bar = String.fromCharCode.apply(String,foo)
var foo=[]
for(var i=0;iApply在某些浏览器中对其接受的参数长度有限制。因此,如果您需要更多参数,您可能希望遵循一种策略来分解参数。如果您阅读了错误的详细信息,这是一个强制限制,而不是递归引起的问题(有问题的bug也抛出了类似的Range错误)
无论如何,我相信你关于字符串连接的预感是正确的-连接不一定像其他方法那样好。与我第一次分解参数的字符串concat相比(类似于MDN中关于应用的讨论中的策略),它边缘化了连接。直接将字符串添加到一起甚至边缘化了连接,这让我有点惊讶(至少在chrome中,我可以想象他们一定有一些智能gc,可以非常有效地重用现有字符串,但可以肯定)
编辑-有趣的是,Chrome在连接速度方面似乎是一个奇怪的选择-对于其他浏览器来说,它在性能方面更接近concat,甚至更好。它很可能是一个有效的参数长度限制;参数需要在堆栈上推送(可能)毕竟,String.fromCharCode
将是递归的,不是吗?没有任何递归发生,当调用apply(String,foo)
时,将传入100000个参数(超过65536个)。我假设“调用堆栈大小”指的是堆栈帧的数量,而不是一个堆栈帧的大小。参数太多只会使顶部堆栈帧的大小变大。啊,感谢到bug跟踪器的链接。如果抛出的错误更清楚一点就好了。是的,我同意。你有一点,65536作为应用的限制似乎不协调d,一般函数最多有524197个参数,但情况是这样的(您可以尝试添加到bug讨论中,看看是否有人参与开发,我自己也很好奇)。