2015-10-16 47 views
2

在這篇文章Optimization Killers中,以下代碼被提及到argument leakJavaScript:參數leak var array.slice.call?

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

但是,我不明白爲什麼參數可以通過Array.slice泄漏?

+0

如何被調用的函數? – Tushar

+1

術語「泄漏」不是用於內存泄漏的意義上,而是指向* arguments *的引用傳遞給另一個函數,因此參數對象必須(或至少很可能)被創建否則不需要。 – RobG

+0

這不是內存泄漏。它打破了JavaScript引擎的優化策略。 – Leo

回答

2

[].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; 
} 
+0

對於微優化來說似乎有很多工作,結果代碼要快多少? – dandavis

+0

複製和粘貼一小塊代碼沒有太多工作。打破優化可能會非常昂貴,但總體開銷取決於函數被調用的頻率以及函數中的其他代碼。 –