2010-02-10 5 views
12

Je vérifie si une variable est définie ou non, et si elle ne se définit pas, je suis explicitement va définir en faisant:« variable » a été utilisé avant qu'il ne soit défini

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

Parce que la variable est non défini JSLint prévient qu'il est utilisé avant qu'il ne soit défini, et c'est exactement ce que je veux.

Comment puis-je surmonter cela?

Je veux permettre de définir les variables qui font explicitement:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

Donc tout le monde qui va inclure ce script peut personnaliser certaines des propriétés. Et je crains de ne pas pouvoir changer cette logique car elle est déjà utilisée dans des centaines de sites web de cette façon.

Faites défiler vers le bas pour les réponses/solutions, parce que j'ai répondu à ma propre question Stack Overflow ne l'affiche pas. Assurez-vous de ne pas les manquer.

Répondre

5

I trouvé des réponses plus acceptables dans la liste de diffusion JSLint, désolé pour ce Boldewyn :)

Solution 1

Dans IE, au niveau d'un script (c.-à-d. par fichier, ou par bloc de script), s'il voit une déclaration "var" pendant sa phase d'analyse (avant l'exécution), il réinitialisera la valeur de cette variable si elle existait déjà.

donc mieux serait de faire simplement ceci:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

en ne déclarant pas « var » et attribuer simplement foo, foo récupèrera automatiquement portée globale.

Solution 2 (cas particulier)

Si la variable explicitement définie n'est pas zéro ou faux

var foo = foo || "some value"; 
+0

Existe-t-il une pénalité de performance pour la solution 2? Ou des effets secondaires? Je suppose que je ne serais pas capable de changer le foo global? – Vanuan

+0

La solution 2 semble avoir un effet secondaire: la page s'est plantée peu après le chargement sur Safari (sur iOS 6.1.3) lorsqu'un fichier JS avait la ligne 'var window = window || {}; ' Chrome (sur Ubuntu 12.04) n'a pas eu un tel problème. Étrange. –

7

Je pense que JSLint vous dit que vous ne devriez pas utiliser les variables avant qu'elles ne soient définies. Si vous êtes satisfait de votre scénario, vous pouvez ignorer cet avertissement. Si vous n'êtes pas absolument sûr, demandez-en un autre pourquoi cette variable n'est pas encore définie. Par exemple, voulez-vous vraiment tester si un variable a une valeur définie, plutôt que est ou n'est pas défini?

var aVariable = null; 

... (un peu plus tard)

if (aVariable == null) { 
    aVariable = value; 
} 
2

Essayez ceci:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

Cette erreur semble être déclenchée lorsque vous utilisez boîtier de chameau pour votre nom de variable. Si vous démarrez la variable avec une lettre majuscule (Variable) ou que vous la mettez en minuscule (variable), vous obtenez simplement l'erreur "implicite globale". Je ne suis pas sûr de ce qu'il essaie de suggérer en appliquant le boîtier sur votre nom de variable, bien que vous deviez toujours prendre JSLint avec un grain de sel. Ce que vous faites ici est parfaitement valide et une bonne pratique pour éviter d'utiliser accidentellement des variables indéfinies.

+0

Question: * JSLint avertit qu'il est utilisé avant qu'elle soit définie *. Comment est-ce lié à l'affaire de chameau? Et ce n'est pas * parfaitement * valide, car JSLint a raison: La variable * est * utilisée avant d'être définie. – Boldewyn

+1

Lisez ma réponse de plus près avant de voter. Il est lié à l'enveloppe du nom de variable utilisé par l'OP: 'aVariable'. Exécutez le même code posté dans la question avec le nom de variable écrit comme 'avariable',' AVARIABLE', ou 'Avariable' et vous remarquerez que JSLint n'affiche plus l'erreur. –

+0

Alors, quel JSLint utilisez-vous? Celui sur http://www.jslint.com/ donne le même résultat indépendamment de l'orthographe car il n'a * rien à voir avec l'orthographe *. – Boldewyn

4

Vous pouvez faire la variable (il est global de toute façon) un membre explicite de window:

window.aVariable = 'default'; 

et plus tard

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

Si vous ne voulez pas ou ne pouvez pas modifier le code, je D suggérer l'Ansatz pragmatique et ignorer les plaintes de JSLint, puisque votre code fonctionnera de toute façon (c'est-à-dire tant que vous n'activez pas le mode strict d'ECMAScript 5 ...).

1

Easiest pour déclarer vos variables avant de faire toute utilisation d'entre eux:

var aVariable; 

Ce sera initialisé avec le type "non défini", donc le test non définie fonctionne toujours:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
} 
Questions connexes