Il grosso problema è almeno duplice:
1) Accesso gli argomenti oggetto deve creare un oggetto arguments. In particolare, i moderni motori JS non creano effettivamente un nuovo oggetto per gli argomenti ogni volta che si chiama una funzione. Passano gli argomenti in pila, o anche nei registri macchina. Non appena tocchi arguments
, però, devono creare un oggetto reale. Questo non è necessariamente economico.
2) Una volta toccato l'oggetto arguments, varie ottimizzazioni che i motori JS possono altrimenti eseguire (ad esempio, rilevare casi in cui non si assegna mai un argomento e ottimizzare tale caso comune) escono dalla finestra. Ogni accesso agli argomenti della funzione, non solo a quelli attraverso arguments
diventa molto più lento perché il motore deve gestire il fatto che si potrebbe aver incasinato gli argomenti tramite arguments
.
fonte
2011-05-27 03:26:39
Buona spiegazione: ho pensato che fosse qualcosa del genere. –
Wow, sono davvero impressionato da questa eccellente risposta. Hai mai lavorato su un motore JS? –
@ Boris Zbarsky. è vero che se facciamo cose di sola lettura come get arguments.length allora il sovraccarico sta semplicemente creando un nuovo oggetto argomenti e le varie ottimizzazioni non saranno influenzate? – Pacerier