2009-12-08 11 views
6

Sono nuovo di JavaScript.C'è qualche proposito di ridichiarare le variabili JavaScript?

<html> 
<body> 
<script type="text/javascript"> 
var x=5; 
document.write(x); 
document.write("<br />"); 
var x; 
document.write(x); 
</script> 
</body> 
</html> 

risultato è:

5 
5 

Quando x viene dichiarata la seconda volta dovrebbe essere indefinito, ma mantiene il valore precedente. Per favore, spiega se questa ridichiarazione ha uno scopo speciale.

+0

Il contenuto della domanda è relativo a un esempio specifico, a cui è stata data risposta in seguito. Tuttavia, ho trovato che [questa risposta] (http://stackoverflow.com/a/12889928/983430) a una domanda simile risponde al caso generico (quando/perché ridichiarò una variabile JavaScript da usare?) Chiesto nel titolo di la tua domanda davvero bene. –

risposta

20

Non si sta davvero dichiarando nuovamente la variabile.

La dichiarazione variabile in JavaScript, è soggetta a sollevamento, che significa che essi sono valutati al parse-tempo e successivamente in fase di esecuzione le assegnazioni sono fatte.

tuo codice alla fine della fase di analisi, prima dell'esecuzione sembra qualcosa di simile:

var x; 
x = 5; 

document.write(x); 
document.write("<br />"); 
document.write(x); 
+0

Grazie ora sono chiaro – Warrior

0

Per quanto riguarda la comprensione di javascript, l'uso della parola chiave var è completamente facoltativo nell'ambito globale. È una storia diversa per le funzioni.

Quando all'interno di una funzione, utilizzare la parola chiave var per indicare che la variabile è locale per la funzione (invece di essere globale per impostazione predefinita).

Io personalmente uso var nell'ambito globale per mostrare che una variabile viene dichiarata e/o utilizzata per la prima volta.

È possibile fare riferimento a http://www.w3schools.com/js/js_variables.asp per ulteriori informazioni.

+2

no non lo è: senza specificare 'var', una variabile potrebbe rientrare nello scope globale. – jldupont

+0

var è usato per scope all'interno di una funzione, all'interno di una funzione se non si usa var è automaticamente globale. –

+0

heh: tutto entro gli stessi 20 secondi. –

1

in modo che quando la seconda volta quando la sua x dichiarata dovrebbe essere indefinito

Quale parte della specifica dice questo?

"Comportamento non definito" non significa "la variabile sarà undefined".

0

Quella seconda variabile x è del tutto superflua.

0

All'interno dello stesso ambito, non è assolutamente necessario "redeclare" una variabile.

0

Inoltre, un programmatore potrebbe voler utilizzare var per localizzare una variabile:

<script> 
var x= 'this is global x'; 
function my_x() { 
var x= 'localized x'; 
alert(x); 
} 
my_x(); 
alert(x); 
</script> 
+0

Anche se questo è possibile e una descrizione molto buona di esso, non sono sicuro che questa è una pratica molto buona per entrare, i nomi delle variabili non dovrebbero essere generalmente ripetuti con diversi utilizza. – Jay

0

Si dovrebbe mai redeclare una variabile all'interno dello stesso ambito, se si vuole veramente cambiare questo, quindi assegnarlo ad esso. Ridichiarazione Non è necessario per creare un oggetto diverso in questa lingua dinamica, se si vuole x essere una stringa solo assegnare:

x = "hello"; 

Non è necessario impostare di nuovo a non definita o ridichiarare prima.

Si prega di notare che cambiare il tipo di variabile non è una buona pratica nella maggior parte delle situazioni, semplicemente affermando che è una possibilità se è quello che ti serve.

7

var da solo non esegue un incarico. Segnala che quando si utilizza il nome della variabile in tutto lo scope in cui si verifica lo var, si sta parlando di una variabile locale e non globale (il controverso valore predefinito). Il var è macchiato quando la funzione viene analizzato e tiene tutto quel campo di applicazione, in modo da dove lo metti è irrilevante:

var a= 0; 

function foo() { 
    a= 1; 
    return a; 
    var a; 
} 

var b= foo(); 
alert('global a='+a+', local a='+b); 

Risultati in global a= 0, local a= 1: anche se la dichiarazione var non viene mai raggiunto nel corso di esecuzione di foo(), è ancora efficace nel rendere a una variabile locale.

Quindi dichiarare var x una seconda volta nello stesso ambito è completamente ridondante. Tuttavia a volte potresti ancora farlo, in genere quando riutilizzi un nome di variabile locale per un secondo uso indipendente all'interno della stessa funzione. Più comunemente:

for (var i= 0; i<onething.length; i++) { 
    ...do some trivial loop... 
} 

for (var i= 0; i<anotherthing.length; i++) { 
    ...do another trivial loop... 
} 

Mentre si potrebbe certamente omettere il secondo var, e strumenti come jslint avrebbe chiesto di farlo, potrebbe in realtà non essere una buona idea.

Immaginate di cambiare o rimuovere in seguito il primo ciclo in modo che non sia più ivar. Ora il secondo ciclo rimanente cambia improvvisamente significato da una variabile locale a una globale. Se non riesci a notare quando aggiorni il primo ciclo che il secondo ciclo ha una dipendenza nascosta (e potresti benissimo non notare che dato come gli occhi elidono il pattern for(...=0 ; ...<...; ...++) in "oh, questo è solo un iteratore standard"), hai un problema sottile e fastidioso da debugare.

0

di recente ho scritto un codice simile:

var obj1 = get_an_object(); 
var v = obj1.get_velocity(); 
v += changes_in_velocity(); 
obj1.set_velocity(v); 

var obj2 = get_an_object(); 
var v = obj2.get_velocity(); 
v += changes_in_velocity(); 
obj2.set_velocity(v); 

(Il codice reale era più complicato e meno ripetitivo)

Per quanto riguarda il browser è interessato, la seconda var v dichiarazione era ridondante e inutile. Per me, ha servito due scopi. Diceva di dimenticare tutto ciò che sapevo del vecchio v, perché si trattava di un nuovo utilizzo. E significava che potevo riordinare il codice, o commentare il primo semestre, senza rompere le cose.

Problemi correlati