5

En el libro Patrones JS de Stefanov, escribe "usa una sentencia var y declara múltiples variables delimitadas por comas", y luego da un ejemplo del patrón "var individual" de la siguiente manera:Desventajas del "patrón var var" Javascript

function func() { 
    var a = 1, 
     b = 2, 
     sum = a + b, 
     myobject = {}, 
     i, 
     j; 

Stefanov, además, escribe:

  • "es una buena práctica para inicializar también la variable con un valor inicial en el momento en que se declara."
  • "También puede hacer un trabajo real en el momento de la declaración, como en el caso de sum = a + b en el código anterior".

Ahora tengo algo de código de la siguiente manera, declarando el mismo número de variables con el patrón var sola, pero haciendo un poco más "trabajo real en el momento de la declaración" bastante:

var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
    ,tpl = new Ext.XTemplate(html) 
    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim() 
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 
    ,tplCfg = { 
     purchaseQty: purchaseQty 
     ,fromLoc: fromLoc 
    }; 

¿Cuáles son las desventajas de hacer demasiado "trabajo real en el momento de la declaración"? Por cierto, no considero este un duplicado exacto de Javascript single var pattern. Am I overloading it? porque estoy preguntando sobre las desventajas generales, en lugar de lo que podría estar mal con mi código.

Creo que puedo ver que una desventaja general sería la imposibilidad de verificar errores, por ejemplo, cuando en mi ejemplo llamo a trim() sobre cadenas esperadas desde record.get, pero si no se devuelve en su lugar, el 'Método de llamada en un objeto indefinido' (o lo que sea que sea;) será lanzado. ¿Alguien puede pensar en otra cosa?

+0

Para el problema con 'trim()' siempre puede escribir su propia función de recorte que verifique si lo que le ha pasado es una cadena o no. – slebetman

+3

@slebetman - No necesita una función: '(record.get ('SRC_SUP_LOC') ||" "). Trim()' (asumiendo, según la pregunta, que '.get()' devuelve un cadena o indefinido/nulo). – nnnnnn

Respuesta

4

Tiene sentido declarar todas las variables en la parte superior del ámbito, es decir, al comienzo de una función o al comienzo del código global. Estoy de acuerdo con eso.

En cuanto a proporcionar valores iniciales en el momento de la declaración, lo tomo como una guía más. En general, es un buen plan, y ciertamente funciona para valores simples, pero a veces el valor inicial no se conoce hasta después de algunos cálculos más complicados, en cuyo caso no proporcionaría un valor predeterminado que nunca se usa solo por el bien de proporcionar algún valor. Y a veces simplemente se pone demasiado complicado.

Además, no daría un valor inicial a las variables de índice de bucle en el momento de la declaración, para mí es mucho más claro asignar el valor al principio del bucle.

Como ya ha señalado, si necesita manejar excepciones, tendrá que hacerlo más adelante en la función también.

Simplemente use algo de sentido común: si tiene muchas variables, puede encontrar que su declaración var se vuelve un poco ilegible, por lo que puede mover parte de la inicialización para más adelante en la función.

Para mí, su código de ejemplo es correcto, pero si necesita agregar mucho más a él sería un poco difícil de leer porque con tanto código en un bloque denso no puedo elegir los nombres de las variables tan fácilmente , pero - y esto es, obviamente, una cuestión de gusto - se puede añadir un poco de espacio en blanco:

var html  = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
    ,tpl  = new Ext.XTemplate(html) 

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()  
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 

    ,tplCfg = { 
     purchaseQty: purchaseQty 
     ,fromLoc: fromLoc 
    }; 

5

Personalmente estoy de acuerdo con Douglas Crockford (aunque aprecio aquellos que no lo hacen), que declarar vars en la parte superior de una función tiene más sentido porque JavaScript no tiene alcance de bloque.

Desde el JSLint site:

En idiomas con ámbito de bloque, se recomienda generalmente que las variables ser declaradas en el sitio de su primer uso. Pero como JavaScript no tiene ámbito de bloque, es más prudente declarar todas las variables de una función en la parte superior de la función. Se recomienda utilizar una única declaración var por función.

La única desventaja es que su código será menos legible para alguien que proviene de un C o un fondo basado en C.

Soy cauteloso de que pueda sonar como un fanático de Crockford aquí, pero me gustaría recommend this talk on coding style y por qué a veces su cerebro debe gobernar su corazón con la estructura del código (dependiendo del idioma).

+2

+1 por mencionar "JavaScript, estilo de programación y tu cerebro". Me encanta esa charla :-) –

+1

No te preocupes por sonar como un fanboi de Crockford conmigo. Descubrí JSON siguiendo un enlace en su sig en comp.lang.javascript * en 2003 * –

0

(Alinear los = señales o variables relacionadas con el grupo con líneas en blanco, o ambas cosas.) Como esto es bastante antiguo y ya no es completamente relevante, es útil señalar a las personas que vienen del mundo es6 que ahora tenemos scop de bloque En g.

Alzando todas las var variables declaradas en la parte superior del alcance de la función de todos modos, pero a veces se da cuenta cuando codifica que una variable solo se usa en un bloque determinado, en cuyo caso es preferible, o incluso que la variable ganó No cambie la referencia, en cuyo caso const es la mejor idea.