如果我定义一个函数
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
。如果我修改嵌套表达式,改为使用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上,第二种形式似乎消耗O(2^n)内存,其中n是嵌套调用的数量。如果我在火狐或Chrome中尝试这个JavaScript,情况就不是这样了,所以它似乎与JavaScriptCore隔离开来。
我几乎没有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)))))));
发布于 2014-12-22 02:36:51
根据对这个问题的评论,大家一致认为所编写的代码没有根本问题,而这是JavaScriptCore中的一个错误。
对于ticket filed,它已被确认为可重复使用,并已被导入苹果的雷达系统。
https://stackoverflow.com/questions/27568249
复制相似问题