2011-05-27 6 views

Respuesta

13

El gran problema es al menos doble:

1) Acceso a los argumentos objeto tiene que crear Object argumentos. En particular, los motores JS modernos en realidad no crean un nuevo objeto para los argumentos cada vez que llamas a una función. Pasan los argumentos en la pila, o incluso en los registros de la máquina. Tan pronto como toque arguments, deben crear un objeto real. Esto no es necesariamente barato.

2) Una vez que toque el objeto arguments, varias optimizaciones que los motores de JS de lo contrario pueden realizar (por ejemplo, la detección de casos en los que nunca se asigna a una discusión y optimizar ese caso común) salir por la ventana. Todos los accesos a los argumentos de la función, no solo a través de arguments, se vuelven mucho más lentos porque el motor tiene que lidiar con el hecho de que usted podría haber interferido con los argumentos a través de arguments.

+0

Buena explicación - pensé que era algo así. –

+0

Guau, estoy realmente impresionado con esta excelente respuesta. ¿Has trabajado en cualquier motor JS? –

+0

@ Boris Zbarsky. ¿Es cierto decir que si hacemos cosas de solo lectura como get arguments.length, entonces la sobrecarga simplemente crea un nuevo objeto de argumentos y las diversas optimizaciones no se verán afectadas? – Pacerier

0

Nunca he escuchado una explicación seria de por qué acceder al objeto arguments es costoso. Sin embargo, este sitio: http://www.playmycode.com/blog/2011/03/simple-yet-effective-javascript-optimisations/ señala que los argumentos no son realmente una matriz y son menos eficientes que el acceso a una matriz. El sitio vinculado anteriormente incluso sugiere convertir argumentos a una matriz como una optimización.

va a comprobar con los que conocen más íntimamente intérpretes JS ...

+0

En ES5, * arguments * es un objeto Arguments con propiedades claramente definidas (ES5 §10.6). – RobG

Cuestiones relacionadas