JavaScript:参数泄漏

JavaScript: arguments leak var array.slice.call?

本文关键字:泄漏 参数 JavaScript      更新时间:2023-09-26

在这篇优化杀手文章中,argument leak提到了以下代码。

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

然而,我不能理解为什么参数可以通过Array.slice泄漏?

[].slice.call(arguments) "泄漏"参数,因为它保留了对参数对象的引用。泄漏参数对象会破坏优化,因为它迫使V8将参数实例化为Javascript对象,而不是将它们优化为堆栈变量。

你应该能够创建一个参数数组的副本,而不保留原始文章中提到的对象引用:

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