2010-11-02 23 views
31

Quiero declarar múltiples variables en una función:declarar múltiples variables en JavaScript

function foo() { 
    var src_arr  = new Array(); 
    var caption_arr = new Array(); 
    var fav_arr  = new Array(); 
    var hidden_arr = new Array(); 
} 

Es esta la forma correcta de hacer esto?

var src_arr = caption_arr = fav_arr = hidden_arr = new Array(); 

Respuesta

64

Sí, es si desea que todos ellos apuntan al mismo objeto en la memoria, pero lo más probable es que quieren que sean matrices individuales, de modo que si uno muta, los otros no lo son afectado.

Si no desea que todos ellos apuntan al mismo objeto, hacer

var one = [], two = []; 

El [] es un literal de taquigrafía para la creación de una matriz.

Así es un registro de la consola que indica la diferencia:

>> one = two = []; 
[] 
>> one.push(1) 
1 
>> one 
[1] 
>> two 
[1] 
>> one = [], two = []; 
[] 
>> one.push(1) 
1 
>> one 
[1] 
>> two 
[] 

En la primera parte, he definido one y two para que apunte al mismo objeto/matriz en la memoria. Si utilizo el método .push, empujo 1 a la matriz, por lo tanto one y two tienen 1 dentro. En el segundo porque definí matrices únicas por variable, así que cuando presioné a una, dos no se vieron afectadas.

+8

bonusPoint para no usar 'new Array()' – DanMan

+0

que estaba teniendo problemas, como se esperaba. Gracias por la explicación! – FFish

+1

punto de bonificación para demostrar cómo funciona;) – jcolebrand

1

No, su segunda declaración creará cuatro referencias a la misma matriz. ¿Quieres:

var src_arr  = [], 
    caption_arr = [], 
    fav_arr  = [], 
    hidden_arr = []; 
0

Todas esas variables se referirán a un objeto Array.

16

Por favor, aléjese de ese patrón de asignación, incluso si desea que todas las variables apunten al mismo objeto.

De hecho, sólo el primero será un declaración de variables, el resto son sólo las asignaciones a posiblemente identificadores declarados!

Asignación de un valor a un identificador no declarado (aka asignación no declarado) Se desaconseja porque, si el identificador no se encuentra en la cadena de ámbito, se creará una variable global. Por ejemplo:

function test() { 
    // We intend these to be local variables of 'test'. 
    var foo = bar = baz = xxx = 5; 
    typeof foo; // "number", while inside 'test'. 
} 
test(); 

// Testing in the global scope. test's variables no longer exist. 
typeof foo; // "undefined", As desired, but, 
typeof bar; // "number", BAD!, leaked to the global scope. 
typeof baz; // "number" 
typeof xxx; // "number" 

Además, el Modo estricto quinto ECMAScript, no se permite este tipo de tareas. En el modo estricto, una asignación realizada a un identificador no declarado causará una excepción TypeError, para evitar los globales implícitos.

Por el contrario, aquí es lo que vemos si está escrita correctamente:

function test() { 
    // We correctly declare these to be local variables inside 'test'. 
    var foo, bar, baz, xxx; 
    foo = bar = baz = xxx = 5; 
} 
test(); 

// Testing in the global scope. test's variables no longer exist. 
typeof foo; // "undefined" 
typeof bar; // "undefined" 
typeof baz; // "undefined" 
typeof xxx; // "undefined" 
+0

mmm, así que la mejor manera es: var one_arr = []; var two_arr = []; Me preguntaba sobre la diferencia entre declaración y asignación. ¿Entonces solo el primero es declarado? – FFish

+1

@FFish: en el ejemplo anterior, la instrucción 'var' se usa solo en el identificador' foo', el resto de las asignaciones de la derecha se evalúan de * derecha a izquierda *, debido a la asociatividad del operador de asignación, (Imagine: 'var foo = value;' donde 'value' es la expresión con múltiples asignaciones (' bar = baz = xxx = 5'), no tienen nada que ver con la instrucción 'var'). Sin embargo, puede usar comas declarar múltiples variables con una sola instrucción 'var':' var one_arr = [], two_arr = [], three_arr = []; ' – CMS

Cuestiones relacionadas