JavaScriptCore嵌套的“调用”性能问题

如果我定义一个函数

inc = function(x) { return x + 1 } 

并对其进行嵌套调用

 inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1))))))))))))))))))))) 

这将导致值22 。 如果我修改嵌套expression式而不是使用call ,则this传入null

 inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1))))))))))))))))))))) 

这也将产生值22

但是,在JavaScriptCore上,第二种forms似乎消耗了O (2 ^ n )内存,其中n是嵌套调用的数量。 如果我在Firefox或Chrome中尝试这种JavaScript,那么情况并非如此,因此它似乎与JavaScriptCore隔离。

我有很less的JavaScript经验(几乎没有)。 我没有感觉到各种JavaScript实现可能做出的折衷,也不知道示例代码在某些实现中是否昂贵(为闭包等提供通用支持)是合理的,而在其他实现中则是有效的。

我的问题是:这个代码固有问题吗? 是否应该改写成不同的结构? 还是代码好 – JavaScriptCore只是有一个bug?

我已经做了一些实验,重构一些临时内部调用会“截断”内存加倍行为

 var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1))))))); var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp1))))))); inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp2))))))); 

基于对这个问题的评论,共识是这个代码没有根本的问题,但是这是JavaScriptCore中的一个错误。

对于提交的票据 ,已被确认为可重复使用并已导入苹果雷达系统。