2010-11-02 12 views
31

Je veux déclarer plusieurs variables dans une fonction:déclarer plusieurs variables JavaScript

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

Est-ce la bonne façon de le faire?

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

Répondre

64

Oui, il est si vous voulez tous pointent vers le même objet en mémoire, mais vous voulez très probablement qu'ils soient des réseaux individuels de sorte que si l'on mute, les autres ne sont pas affecté.

Si vous ne voulez pas tous pour pointer vers le même objet, faire

var one = [], two = []; 

Le [] est un littéral raccourci pour créer un tableau.

Voici un journal de la console qui indique la différence:

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

Dans la première partie, je définissais one et two pour pointer vers le même objet/tableau en mémoire. Si j'utilise la méthode .push, il pousse 1 à la matrice, et donc one et two ont 1 à l'intérieur. Dans la seconde depuis que j'ai défini des tableaux uniques par variable, quand j'ai poussé à un, deux n'étaient pas affectés.

+8

Bonuspoint pour ne pas utiliser 'new Array()' – DanMan

+0

j'avais des problèmes, comme prévu. Merci pour l'explication! – FFish

+1

bonuspoint pour montrer comment cela fonctionne;) – jcolebrand

1

Non, votre deuxième instruction créera quatre références au même tableau. Vous voulez:

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

Toutes ces variables se réfèrent à un objet Array.

16

SVP restez à l'écart à partir de ce modèle d'affectation, même si vous souhaitez que toutes les variables pointent vers le même objet.

En fait, seule la première sera une déclaration de variable , les autres sont simplement des assignations à des identificateurs non déclarés éventuellement !

L'attribution d'une valeur à un identificateur non déclaré (alias assignation non déclarée) est fortement déconseillée car, si l'identificateur n'est pas trouvé sur la chaîne de portées, une variable GLOBAL sera créée. Par exemple:

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" 

De plus, le mode ECMAScript 5ème Strict interdit ce type d'affectation. En mode strict, une affectation faite à un identificateur non déclaré entraînera une exception TypeError, pour empêcher les globales implicites.

En revanche, voici ce que nous voyons si elle est correctement écrit:

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, donc le meilleur moyen est: var one_arr = []; var deux_arr = []; Je m'interrogeais sur la différence entre déclaration et cession. Donc, seul le premier est déclaré? – FFish

+1

@FFish: Dans l'exemple ci-dessus, l'instruction 'var' est utilisée uniquement dans l'identificateur' foo', le reste des affectations à droite est évalué de * droite-à-gauche *, en raison de l'associativité de l'opérateur d'affectation, (Imaginez: 'var foo = valeur;' où 'value' est l'expression avec plusieurs affectations (' bar = baz = xxx = 5'), ils n'ont rien à voir avec l'instruction 'var'. Cependant, vous pouvez utiliser des virgules pour déclarer plusieurs variables avec une seule instruction 'var':' var one_arr = [], two_arr = [], three_arr = []; ' – CMS

Questions connexes