2011-01-14 12 views
5

por alguna razón hago eso cada vez porque lo encuentro limpio. Declaro variables en la parte superior para usarlas a continuación. Lo hago incluso si los uso solo una vez.¿Es una mala práctica de Javascript lo que estoy haciendo aquí?

Aquí es un ejemplo (usando jQuery marco):

$("#tbListing").delegate("a.btnEdit", "click", function(e) { 
    var storeId = $(this).closest("tr").attr("id").replace("store-", ""), 
     storeName = $(this).closest("tr").find("td:eq(1)").html(), 
     $currentRow = $(this).closest("tr"); 

    $currentRow.addClass("highlight"); 

    $("#dialogStore") 
     .data("mode", "edit") 
     .data("storeId", storeId) 
     .data("storeName", storeName) 
     .dialog("open"); 

    e.preventDefault(); 
}); 

que tienden a hacer que en PHP también. ¿Tengo razón si creo que no es muy eficiente en la memoria para hacer eso?

Edit: Gracias por todas las respuestas. Todos ustedes han dado buenas respuestas. Acerca de esa optimización de código ahora. ¿Eso es mejor ahora?

  $("#tbListing").delegate("a.btnEdit", "click", function(e) { 
       var $currentRow = $(this).closest("tr"), 
        storeId = this.rel, /*storing the storeId in the edit button's rel attribute now*/ 
        storeName = $currentRow.find("td:eq(1)").html(); 

       $currentRow.addClass("highlight"); 

       $("#dialogStore") 
        .data("info", { 
         "mode" : "edit", 
         "storeId" : storeId, 
         "storeName" : storeName 
        }) /*can anyone confirm that overusing the data isn't very efficient*/ 
        .dialog("open"); 


       e.preventDefault(); 
      }); 
+1

repitiendo $ (this) .closest ("tr") podría evitarse;) –

+0

No quiero comentarios como: Oye, lo estás haciendo mal porque almacenas información en los atributos "id" o algo así o solo debes almacenar información una vez en los datos usando un objeto. Solo quiero saber qué tan malo es para la memoria/memoria permitida del navegador hacerlo. – Cybrix

+0

@Caspar, sí, soy consciente de eso. Podría simplemente almacenar el '$ (this) .closest (" tr ")' en una variable para que jQuery no tenga que ejecutar el DOM cada vez. : P – Cybrix

Respuesta

12

Lo sentimos, ¿está preguntando si está bien para declarar las variables incluso si las está utilizando una vez?

¡Absolutamente! Hace que el código sea un millón de veces más legible si nombra las cosas correctamente con una variable. La legibilidad debería ser su principal preocupación. La eficacia de la memoria solo debería ser una preocupación si resulta problemático.

Como dijo Knuth,

Debemos olvidarnos de pequeñas eficiencias, dicen que alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal.

Si preguntas más sobre la declaración de las variables al comienzo de la función, en lugar de en los que se utilizan en primer lugar, a continuación, Emmett has it right - Crockford recomienda hacer esto en JavaScript para evitar la confusión relacionados con el ámbito. Si vale la pena en PHP es una pregunta puramente subjetiva, diría, pero no hay nada de malo en mantener sus estilos de codificación PHP y JS similares.


Una cita más CS (de Abelson y Sussman SICP de):

programas deben ser escritos para que la gente lea, y sólo incidentalmente para máquinas para su ejecución.

+1

97% en los años 70. Ahora es más 99.97% –

+0

, por lo que debes decir que solo debes preocuparte por la eficacia de la memoria cuando ocurre (porque la eficiencia de la memoria siempre es problemática por su naturaleza), eso es una prueba de futuro deficiente. Sin duda, la legibilidad es el segundo para funcionar? – benhowdle89

+0

@Marco Muy buen punto. – Skilldrick

6

No es una mala práctica.

Los enunciados var deben ser los primeros enunciados en el cuerpo de la función.


JavaScript no tiene ámbito de bloque, por lo que definir variables en bloques pueden confundir a los programadores que experimentaron con otros familiares lenguajes C. Defina todas las variables en la parte superior de la función .

http://javascript.crockford.com/code.html

+5

No todo el mundo está de acuerdo con todo lo que dice Crockford, sobre todo en este punto en particular. Ciertamente no. –

+0

@Tim, entonces, ¿dónde sugieres que se definan las variables? – Emmett

+0

¿Eh? En el código de ejemplo dado, la instrucción 'var' * es * la primera línea en el cuerpo de la función. – Spudley

2

Declaración de variables en la parte superior es una buena cosa que hacer. Hace que el código sea más legible. En su ejemplo particular, podría reemplazar $ (this) .closest ('tr') con una variable, como se sugiere en los comentarios, pero en general encuentro el código con nombres de variables descriptivos, todo en un solo lugar, muy legible.

1

nah, yo diría que estás haciendo exactamente lo correcto.

Como dice @Caspar, podría simplificar su código configurando primero $currentRow y usando eso en lugar de $(this).closest("tr") en las otras dos líneas. Y puede haber algunas otras cosas que podrías mejorar. Pero establecer vars al comienzo de una función de la manera que lo has hecho es absolutamente una buena cosa.

Especialmente bueno porque lo has hecho dentro de la función, por lo que son variables locales, lo que significa que se descartan al final de la función, por lo que no hay problemas de uso de memoria.

Si los hubiera establecido como variables globales, podría haber sido un problema mayor, aunque para ser honesto incluso entonces, ya que solo está configurando punteros a un objeto existente, no usaría un gran cantidad de memoria incluso entonces (aunque estaría contaminando el espacio de nombres global, que no es bueno)

+0

+1 Gracias, has especificado que se desechan después de la ejecución porque son variables locales. Pensé eso, pero no estaba seguro. – Cybrix

+0

Me gustaría saber ** algunas otras cosas que podrías mejorar **. Edité mis preguntas e incluí una (creo) versión optimizada. ¿Te importa echarle un vistazo? – Cybrix

Cuestiones relacionadas