我听说很多人说访问参数对象很昂贵。 (例如:Why was the arguments.callee.caller property deprecated in JavaScript?)
顺便说一下这句话到底意味着什么?是不是只是简单的属性查找访问参数对象?究竟有什么大不了的?
答案 0 :(得分:14)
重要的事情至少有两个方面:
1)访问arguments对象必须创建一个arguments对象。特别是,每次调用函数时,现代JS引擎实际上并不为参数创建新对象。它们在堆栈上传递参数,甚至在机器寄存器中传递参数。但是,只要触摸arguments
,就必须创建一个实际对象。这不一定便宜。
2)一旦你触摸了arguments对象,JS引擎可以执行的各种优化(例如,检测你从未分配给参数并优化该常见情况的情况)就会出现。每次访问函数参数,而不仅仅是通过arguments
的访问变得慢得多,因为引擎必须处理你可能通过arguments
搞乱参数的事实。
答案 1 :(得分:0)
我也从未听过为什么访问arguments对象的代价很高的严肃解释。但是,这个站点:http://www.playmycode.com/blog/2011/03/simple-yet-effective-javascript-optimisations/注意到参数实际上不是一个数组,并且效率低于访问数组。上面链接的网站甚至建议将参数转换为数组作为优化。
去与那些更熟悉JS口译人员的人核实...