在这篇文章Optimization Killers中,argument leak
提到了以下代码。
function leaksArguments2() {
var args = [].slice.call(arguments);
}
但是,我无法理解为什么参数可以通过Array.slice
泄漏?
答案 0 :(得分:2)
[].slice.call(arguments)
“泄漏”参数,因为它保留了对arguments对象的引用。泄漏arguments对象会导致优化,因为它会强制V8将参数实例化为Javascript对象,而不是将它们优化为堆栈变量。
您应该能够以不保留原始帖子中提到的对象引用的方式创建arguments数组的副本:
function doesntLeakArguments() {
//.length is just an integer, this doesn't leak
//the arguments object itself
var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
//i is always valid index in the arguments object
args[i] = arguments[i];
}
return args;
}