JavaScript:参数leak var array.slice.call?

时间:2015-10-16 04:23:19

标签: javascript memory-leaks arguments

在这篇文章Optimization Killers中,argument leak提到了以下代码。

function leaksArguments2() {
    var args = [].slice.call(arguments);
}

但是,我无法理解为什么参数可以通过Array.slice泄漏?

1 个答案:

答案 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;
}