Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Safari调用function.apply递归?_Javascript_Safari - Fatal编程技术网

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讨论中,看看是否有人参与开发,我自己也很好奇)。