Sta usando ‘var’ per dichiarare variabili opzionali?

“Var” è opzionale?

myObj = 1; 

uguale a ?

 var myObj = 1; 

Ho scoperto che entrambi funzionano dal mio test, presumo che var sia opzionale. È giusto?

Significano cose diverse. Se si utilizza var la variabile viene dichiarata all’interno dell’ambito in cui ci si trova (ad esempio, la funzione). Se non si utilizza var , la variabile esplode attraverso i livelli dell’ambito fino a quando non incontra una variabile con il nome specificato o l’object globale (finestra, se lo si sta facendo nel browser), dove viene quindi collegato. È quindi molto simile a una variabile globale. Tuttavia, può ancora essere eliminato con delete (molto probabilmente dal codice di qualcun altro che non è riuscito a usare var ). Se si utilizza var nell’ambito globale, la variabile è veramente globale e non può essere eliminata.

Questo è, a mio parere, uno dei problemi più pericolosi con javascript, e dovrebbe essere deprecato, o almeno sollevare avvisi sugli avvertimenti. Il motivo è che è facile dimenticare var e avere per errore un nome di variabile comune associato all’object globale. Ciò produce un comportamento strano e difficile da eseguire il debug.

Questa è una delle parti più complicate di Javascript, ma anche una delle sue caratteristiche principali. Una variabile dichiarata con var “inizia la sua vita” esattamente dove l’hai dichiarata. Se si omette il var , è come se si trattasse di una variabile che si è già utilizzata in precedenza.

 var foo = 'first time use'; foo = 'second time use'; 

Per quanto riguarda la portata, non è vero che le variabili diventano automaticamente globali. Piuttosto, Javascript attraverserà la catena dell’ambito per vedere se hai già usato la variabile in precedenza. Se trova un’istanza di una variabile con lo stesso nome usato in precedenza, userà quello e qualsiasi ambito in cui è stato dichiarato. Se non incontra la variabile ovunque verrà colpito l’object globale ( window in un browser ) e allegherà la variabile ad esso.

 var foo = "I'm global"; var bar = "So am I"; function () { var foo = "I'm local, the previous 'foo' didn't notice a thing"; var baz = "I'm local, too"; function () { var foo = "I'm even more local, all three 'foos' have different values"; baz = "I just changed 'baz' one scope higher, but it's still not global"; bar = "I just changed the global 'bar' variable"; xyz = "I just created a new global variable"; } } 

Questo comportamento è davvero potente se usato con funzioni e callback annidati. Apprendere quali functions sono e come funziona lo scope è la cosa più importante in Javascript.

No, non sono equivalenti.

Con myObj = 1; stai usando una variabile globale.

Quest’ultima dichiarazione crea una variabile locale per l’ambito che stai utilizzando.

Prova il seguente codice per capire le differenze:

 external = 5; function firsttry() { var external = 6; alert("first Try: " + external); } function secondtry() { external = 7; alert("second Try: " + external); } alert(external); // Prints 5 firsttry(); // Prints 6 alert(external); // Prints 5 secondtry(); // Prints 7 alert(external); // Prints 7 

La seconda funzione altera il valore della variabile globale “external”, ma la prima funzione no.

C’è un po ‘di più che solo locale vs globale. Le variabili globali create con var sono diverse da quelle create senza. Considera questo:

 var foo = 1; // declared properly bar = 2; // implied global window.baz = 3; // global via window object 

Sulla base delle risposte finora, queste variabili globali, foo , bar e baz sono tutte equivalenti. Questo non è il caso. Le variabili globali create con var sono (correttamente) assegnate alla proprietà interna [[DontDelete]] , in modo che non possano essere eliminate.

 delete foo; // false delete bar; // true delete baz; // true foo; // 1 bar; // ReferenceError baz; // ReferenceError 

Questo è il motivo per cui dovresti sempre usare var , anche per variabili globali.

var è facoltativo. var inserisce una variabile nell’ambito locale. Se una variabile è definita senza var , è in ambito globale e non può essere cancellata .

modificare

Ho pensato che la parte non eliminabile fosse vera ad un certo punto nel tempo con un certo ambiente. Devo averlo sognato.

C’è così tanta confusione su questo argomento, e nessuna delle risposte esistenti copre tutto in modo chiaro e diretto. Ecco alcuni esempi con commenti in linea.

 //this is a declaration var foo; //this is an assignment bar = 3; //this is a declaration and an assignment var dual = 5; 

Una dichiarazione imposta un flag DontDelete. Un incarico no.

Una dichiarazione lega quella variabile allo scope corrente.

Una variabile assegnata ma non dichiarata cercherà un ambito a cui assegnarsi. Ciò significa che attraverserà la catena alimentare dello scope fino a trovare una variabile con lo stesso nome. Se nessuno viene trovato, verrà collegato all’ambito di applicazione di livello superiore (che viene comunemente definito globale).

 function example(){ //is a member of the scope defined by the function example var foo; //this function is also part of the scope of the function example var bar = function(){ foo = 12; // traverses scope and assigns example.foo to 12 } } function something_different(){ foo = 15; // traverses scope and assigns global.foo to 15 } 

Per una descrizione molto chiara di ciò che sta accadendo, questa analisi della funzione di cancellazione copre ampiamente l’istanziazione e l’assegnazione.

Dai un’occhiata a questo Fiddle: http://jsfiddle.net/GWr6Z/2/

 function doMe(){ a = "123"; // will be global var b = "321"; // local to doMe alert("a:"+a+" -- b:"+b); b = "something else"; // still local (not global) alert("a:"+a+" -- b:"+b); }; doMe() alert("a:"+a+" -- b:"+b); // `b` will not be defined, check console.log 

Non sono la stessa cosa.

Le variabili non dichiarate (senza var ) sono trattate come proprietà dell’object globale. (Di solito l’object window , a meno che tu non abbia un blocco with )

Le variabili dichiarate con var sono normali variabili locali e non sono visibili al di fuori della funzione in cui sono dichiarate. (Si noti che Javascript non ha scope di blocco)

La parola chiave var in Javascript è lì per uno scopo.

Se dichiari una variabile senza la parola chiave var, in questo modo:

 myVar = 100; 

Diventa una variabile globale a cui è ansible accedere da qualsiasi parte del tuo script. Se non lo hai fatto intenzionalmente o non ne sei a conoscenza, può causare dolore se riutilizzi il nome della variabile in un’altra posizione nel tuo javascript.

Se dichiari la variabile con la parola chiave var, in questo modo:

 var myVar = 100; 

È locale per l’ambito ({] – parentesi, funzione, file, a seconda di dove lo hai posizionato).

Questo è un modo più sicuro per trattare le variabili. Quindi, a meno che non lo si faccia di proposito, provare a dichiarare la variabile con la parola chiave var e non senza.

Considera questa domanda posta oggi a StackOverflow:

Semplice domanda Javascript

Un buon test e un esempio pratico è ciò che accade nello scenario sopra …
Lo sviluppatore ha utilizzato il nome della funzione JavaScript in una delle sue variabili.

Qual è il problema con il codice?
Il codice funziona solo la prima volta che l’utente fa clic sul pulsante.

Qual è la soluzione?
Aggiungi la parola chiave var prima del nome della variabile.

Var non ti permette, il programmatore, di dichiarare una variabile perché Javascript non ha variabili. Javascript ha oggetti. Var dichiara un nome per un object non definito, esplicitamente. L’assegnazione assegna un nome come handle a un object a cui è stato assegnato un valore.

L’uso di var dice all’interprete Javacript due cose:

  1. non utilizzare il deltaversal di ricerca della delega per il nome, utilizzare invece questo
  2. non cancellare il nome

L’omissione di var dice all’interprete Javacript di utilizzare l’istanza precedente trovata prima di un object con lo stesso nome.

Var come una parola chiave nasce da una scarsa decisione del progettista di linguaggi, nello stesso modo in cui Javascript come nome nasce da una decisione sbagliata.

ps. Studia gli esempi di codice sopra.

Tutto a parte la portata, possono essere usati in modo diverso.

 console.out(var myObj=1); //SyntaxError: Unexpected token var console.out(myObj=1); //1 

Qualcosa di qualcosa di dichiarazione contro espressione

No, non è “richiesto”, ma potrebbe anche essere che può causare gravi problemi su tutta la linea se non lo fai. Non definendo una variabile con var metti quella variabile all’interno dell’ambito della parte del codice in cui si trova. Se non lo fai allora non è contenuto in quell’ambito e può sovrascrivere variabili definite in precedenza con lo stesso nome che sono al di fuori dell’ambito della funzione in cui ti trovi

Ho appena trovato la risposta da un forum riferito da uno dei miei colleghi. Se dichiari una variabile all’esterno di una funzione, è sempre globale. Non importa se usi la parola chiave var o meno. Ma se dichiari la variabile all’interno di una funzione, ha una grande differenza. All’interno di una funzione, se si dichiara la variabile utilizzando la parola chiave var, sarà locale, ma se si dichiara la variabile senza parola chiave var, sarà globale. Può sovrascrivere le variabili dichiarate in precedenza. – Vedi di più su: http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash. xNnLrwc3.dpuf