2015-08-12 1 views
1

Je voudrais savoir pourquoi JSLint se plaint que je pourrais être une variable fuite lors de la définition des variables comme celui-ci:fuite de mémoire lors de la définition d'une variable

var foo = bar = {}; 

Il dit que je pourrais être une fuite bar.

Mon intuition est que c'est parce que bar est variable globale. Ensuite, comment puis-je affecter foo et bar pour pointer vers le même objet dans une ligne? JavaScript ne me laisse pas écrire:

var foo = var bar = {}; 

Ou est le problème quelque chose d'autre?

+1

Que diriez-vous de: 'var bar = {}, foo = bar;'? –

+3

Vous voulez vraiment 'foo' et' bar' pour faire référence au ** même objet ** ?! – deceze

+0

@deceze Je ne vois aucune raison pour cela mais j'étais curieux en suivant un tutoriel JavaScript. –

Répondre

2

La raison pour laquelle il se plaint de « fuite une variable » est parce que vous êtes seulement déclarer la variable locale foo. bar n'est pas déclaré, il est juste assigné, donc cela crée une variable globale. Votre déclaration équivaut à:

var foo = (bar = {}); 

qui est l'abréviation de:

bar = {}; 
var foo = bar; 

écrit de cette façon, vous pouvez voir qu'il n'y a pas de déclaration de la variable bar.Si vous voulez déclarer plusieurs variables dans une seule instruction var, vous devez les séparer par des virgules:

var bar = {}, foo = bar; 

Ou vous pouvez les écrire comme des déclarations séparées:

var bar = {}; 
var foo = bar; 

Vous pouvez aussi séparer les déclarations et affectations:

var foo, bar; 
foo = bar = {}; 
+0

J'ai écrit ce test rapide '(function() { var notLeakedA =" A ", notLeakedB =" B "; veryMuchLeakedC =" C "; })();' et en dehors de l'IIFE, seul 'veryMuchLeakedC' était accessible. –

+0

@IgweKalu C'est prévu. 'var' déclare des variables locales, elles ne sont pas accessibles en dehors de la fonction. – Barmar

2

Vous avez 2 options:

var foo = {}, 
    bar = {}; 

Ou:

var foo, bar; 
foo = bar = {}; 

Le premier crée des objets individuels pour foo et bar.
Dans le deuxième exemple, à la fois foo et bar pointent vers le même objet.

Vous ne pouvez pas (/ ne devrait pas essayer de)et déclarer attribuer plusieurs variables à l'aide d'une seule instruction var, et un seul objet littéral, sur une seule ligne. Ensuite, vous déclarez simplement plusieurs variables qui pointent vers le même objet.

2

meilleure approche serait:

var foo = {} , bar = {}; 

Mais foo et bar serait se référer à deux objets différents.

Si vous voulez qu'ils se réfèrent au même objet, puis:

var foo = {}, bar = foo;