var x = 10; y = 2;
Si può usare javascript per molto tempo senza domandarsi quale sia la differenza tra dichiarare una variabile usando var e dichiararla senza; in base allo stile di programmazione può essere molto raro, oppure molto frequente, che questo porti a dei problemi.
Nel dubbio è sempre meglio dichiarare le variabili usando var, ma qual’è la differenza?
Usando var la variabile è locale, ha lo stesso scope della dichiarazione; quindi è visibile e modificabile da tutte le funzioni annidate ma non lo è dall’ambiente esterno che in alcun modo va a modificare. Appena si esce dallo scope viene distrutta.
Se invece non si usa var ci sono due possibilità:
- Si risale nella catena di scoping statico e se si incontra una variabile con tale nome se ne modifica il valore; che è il comportamento che ci si aspetta: se c’è una variabile visibile viene modificata.
- Se si risale la catena fino all’ambiente globale senza trovare una variabile già dichiarata allora si dichiara una variabile globale con quel nome. E questo è molto pericoloso, può portare a comportamenti indesiderati.
Chiaramente è più a rischio chi tende ad usare sempre gli stessi nomi di variabili, ad esempio il classico indice i per i contatori.
function foo(){ for(i=0; i < 5; i++)console.log('Foo:'+i); } for(i = 0; i < 3; i++) { foo(); console.log('Main for:'+i); } |
|
Output atteso | Output effettivo |
Foo:0 Foo:1 Foo:2 Foo:3 Foo:4 Main for:0 Foo:0 Foo:1 Foo:2 Foo:3 Foo:4 Main for:1 Foo:0 Foo:1 Foo:2 Foo:3 Foo:4 Main for:2 |
Foo:0 Foo:1 Foo:2 Foo:3 Foo:4 Main for:5 |
Con gli esempi può sembrare tutto molto semplice, errori stupidi, ma in progetti più grossi di una pagina in cui non si ha tutto il codice sott’occhio è molto facile fare casini. Sopratutto perché quando si scrive tanto codice si tende a ridurre al minimo i caratteri da digitare, viene naturale non scrivere var e chiamare le variabili tutte con nomi corti che alla lunga tendono a ripetersi.
Nota: A livello globale non fa differenza ma per prendere l’abitudine è bene usare comunque var.