2009-02-24 18 views
10

questo frammento si traduce in un errore di runtime JavaScript: (foo non è definito)L'uso di variabili non definite in se-dichiarazioni

if (foo) { 
    // ... 
} 

devo definire foo prima, in questo modo:

var foo = foo || null // or undefined, 0, etc. 

... E solo allora posso fare:

if (foo) { 
    // ... 
} 

Perché è quello?


Aggiornamento:

Questo è stato un po 'un brainfart sul mio lato delle cose: 'fcourse non è possibile accedere a una variabile che non è allocato.

Cose divertenti che puoi fare un typeof() su una variabile indefinita tu. Accetterò la risposta di miccet poiché penso che sia la soluzione più elegante.

+0

[Questo] articolo (http://2ality.com/2013/04/check-undefined.html) 2ality menzioni diverso consigliata modi per controllare _undefined_, incluso interpretarlo come _falsy_ in contesti booleani. – martieva

risposta

11

Dovrai definirlo, per poterlo verificare per un valore. In questo caso stai controllando che il tempo sia vero. Ovviamente questa variabile non è impostata su nulla, come null in C# e Nothing in VB, ad esempio.

Se è necessario, problemi di debug o qualsiasi altra cosa, si potrebbe verificare se la variabile non è definita in questo modo:

if (typeof(variable) == "undefined") 
+0

Bel piccolo frammento. Molto elegante. Lo terrò a mente. È strano che si possa fare un typeof() su una variabile non definita, ma non: if (undefinedVariable! == null). – roosteronacid

+1

Sì, l'ho trovato abbastanza utile. Immagino che la ragione sia perché si guarda _at_ it piuttosto che _into_ it, se questo ha senso. – miccet

+0

+1 questo è quello che stavo per suggerire anche io. – cletus

1

Quello sarebbe perché si sta ora definendo con:

var foo = foo || null 

Perché non lo definisci in primo luogo? Mi sembra abbastanza semplice (a meno che mi manchi qualcosa).

L'utilizzo di una variabile prima che sia stata creata (o impostata su qualcosa) è una cattiva pratica di programmazione e dovrebbe essere evitata. Il mio consiglio è di non usare quel trucco per assicurarsi che sia impostato su qualcosa ma per rintracciare l'errore logico e sistemarlo.

0

Mi sembra una domanda strana. Diciamo che volevo chiamare una funzione: -

thing();

Se la cosa non è stata definita ovunque sicuramente mi aspetterei che fallisca.

Perché dovresti utilizzare una variabile denominata foo senza definirla in alcun punto del tuo codice?

18

Sento che mi stai chiedendo perché sei consapevole del fatto che javascript sembra consentire le variabili non definite in alcune situazioni (cioè senza errori di runtime) e non in altri.

Il ragionamento è il seguente: javascript sempre genera un errore sul controllo di variabili non definite, ma mai genera un errore sul controllo undefined proprietà, fino a quando si utilizza un solo livello di indirezione.

Esempio:

// throws runtime error 
if(foo) { 
    // ... 
} 

// does not throw runtime error 
if(window.foo) { 
    // ... 
} 

// does not throw runtime error 
var obj = {}; 
if(obj.foo) { 
    // ... 
} 

// throws runtime error 
if(obj.foo.bar) { // going two levels deep, but foo is undefined 
    // ... 
} 

Speranza che libera un po '.

+1

Grazie per averlo chiarito. – roosteronacid

0

Questa è una domanda strana. Per rispondere penso che sia meglio porre la domanda viceversa ...

quale sarebbe il risultato atteso di

if (foo) { 
    // ... 
} 

dove foo non è definita come una variabile?

Penso che l'unica risposta possibile sia che il if valuterà sempre il falso e non eseguirai mai quel blocco.

Chiedendo una domanda più diretta a te, perché dovresti aspettarti che il codice funzioni, che si riferisce a variabili che non esistono e che non hanno avuto valori assegnati? Cosa è foo nel contesto che hai definito sopra?

La conclusione è che senza la dichiarazione la dichiarazione successiva non ha alcun significato. foo non è un termine che può essere valutato da solo, quindi devi fornire all'interprete un contesto per il riferimento a foo in modo che possa valutarlo.

Ci sono linguaggi che creano automaticamente delle variabili per te quando vengono assegnate per la prima volta (Python e VB condividono quel tratto pericoloso) ma anche quelle non saranno in grado di valutare una variabile prima dell'assegnazione, quindi gli interpreti generano errori.

Se si ha un compilatore che ti avrebbe raccontato anche questo ...

0

Questa non è una strana domanda coz sono sulla stessa barca: p

mi raggiunge qui dopo googling " javascript use variable undefined ". Ho confuso il coz che ho visto da qualche parte che le persone possono semplicemente usare una variabile non definita in un ciclo.

Forse ho visto in lingua diversa


ho trovato. I primi codici sono stati eseguiti con successo mentre il secondo codice errore di runtime.

primi codici:

test(); 
function test() { x = 4; } 
console.log(x); //this produce 4 

secondi codici:

test(); 
function test() { x[0] = 1; } 
console.log(x[0]); 
Problemi correlati