2011-08-24 7 views
9

que se dan cuenta de que es útil (por razones de rendimiento) para hacer algo así ...¿Cuál es el punto de reasignar variables de argumento?

function Abc(a, b, c) { 
    var window = window; 

Por eso, cuando el código de acceso a window, que no tiene que subir por la cadena de ámbito encontrar finalmente window. El mismo se puede hacer para document, navigator, etc ...

Pero estoy en el proceso de reescritura de algunos de los MobiScroll jQuery plugin y encontramos este ...

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

¿Cuáles son las ventajas de reinicialización elm y dw para apuntar a sus variables de argumento?

He leído mucho sobre el acceso a arguments que es costoso, pero nunca he leído nada sobre por qué esto podría ser una buena práctica.

¿Cuáles son los beneficios al hacer esto?

En el pasado, tengo deliberately removed este constructo de la documentación de MDN.

+0

Nunca lo he visto. Deje que el motor se preocupe por las "optimizaciones". –

+0

@pst Acepto. Sin embargo, tengo una mente curiosa ... – alex

+1

Es más o menos un duplicado de [Javascript - ¿Debo usar 'var' al reasignar una variable definida en los parámetros de la función?] (Http://stackoverflow.com/questions/2495174/javascript-do-i-need -to-use-var-when-reassigning-a-variable-defined-in-the-fu). Sin embargo, no sé si estas son las respuestas que desea. –

Respuesta

2
> function Abc(a, b, c) { 
>  var window = window; 

Por eso, cuando el código de acceso a la ventana, que no tiene que subir por la cadena de ámbito para encontrar finalmente ventana.

No creo que ese sea el motivo. Para una función declarada en el alcance global, resolver un identificador localmente versus globalmente será insignificantemente más rápido (y quizás más lento dependiendo del navegador).

scripts pueden usar algo similar a la anterior para asegurar ventana se refiere a la esperada objeto ventana y no algún otro ventana en la cadena de ámbito, por ejemplo,

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

En el segundo ejemplo:

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

declaración de variables es completa pérdida de tiempo. Poner un identificador en la lista de parámetros formales de una declaración o expresión de función es equivalente a declararlo localizando con var. Declarar tales identificadores como variables locales no tiene ningún efecto.

Hubo una versión anterior de Safari que tenía un problema con los parámetros formales que no tenían un valor pasado, pero eso fue hace mucho tiempo y solo fue un problema en un caso muy específico.

+0

+1 gracias RobG, esta es una gran respuesta. – alex

+2

En cuanto a la primera parte de la respuesta: Sí, para las funciones globales, no habrá grandes diferencias. Pero a menudo las funciones se anidan en otras funciones, se utilizan como devoluciones de llamada, etc. y tiene sentido conseguir cualquier objeto lo más cerca posible. También depende de * con qué frecuencia * se accede a un determinado objeto. Una regla general es que, si accede a una propiedad u objeto más de una vez, almacénelo en una variable local. –

+0

@Felix King No utilizo esa regla general: mi regla de oro es "... si hace que el código sea más legible/mantenible, entonces ..." que no tiene nada que ver con el "rendimiento" "o" cuenta ". –

0

La única razón lógica es potencialmente aclarar lo que alcance la variable fue declarada en.

Aparte de eso, sólo se suma el exceso de código.