2010-09-16 14 views
24
alert(myVar1); 
return false; 
var myVar1; 

Sopra codice genera errore in IE, FF e Opera affermando che dichiarazione di ritorno deve venire nella funzione. Ma funziona (mostra undefined) in Safari e Chrome.sollevamento variabile

Il codice precedente è stato scritto in ambito globale. Al di fuori di tutte le funzioni.

Qualsiasi motivo?

+10

Sono spaventato, confuso e leggermente incuriosito ... cosa stai cercando di complice? –

+2

@Hahsen, sto solo cercando di capire vari browser e javascript disponibili. Questo è un sollevamento variabile e sto cercando di capire il suo comportamento nell'ambito globale insieme a una dichiarazione di ritorno. Sebbene return non sia permesso quando non si è in definizione di funzione ma il codice funziona ancora in chrome e safari. Sto cercando di scoprire il motivo – alter

+0

Potrebbe essere più facile capirlo come variabile e dichiarazione * pre-elaborazione *. Le dichiarazioni non vengono spostate (o "issate in cima"), vengono elaborate prima dell'esecuzione di qualsiasi codice. Leggi ECMA-262 §10.3 su cosa succede quando si entra in un contesto di esecuzione, è ragionevolmente facile da capire. – RobG

risposta

23

In variabili JavaScript vengono spostati verso l'alto della sceneggiatura e quindi eseguire. Quindi, quando si esegue lo farà

var myVar1; 
alert(myVar1); 
return false; 

Questo perché javascript realmente non hanno un vero senso di scoping lessicale. Questo è il motivo per cui la sua migliore pratica considerata di avere tutte le variabili dichiarate nella parte superiore dell'area verranno utilizzate per impedire il sollevamento che causa un problema. JSLint si lamenterà di questo.

Questo è un buon articolo che spiega http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

Il ritorno non è valido. Se si vuole fare un vero esempio di sollevamento (tratto dal link qui sotto) fare

var foo = 1; 
function bar() { 
    if (!foo) { 
     var foo = 10; 
    } 
    alert(foo); 
} 
bar(); 

Questo avviserà 10

EDIT dopo il commento

Qui di seguito è la mia comprensione e ho letto da qualche parte ma non riesco a trovare tutte le fonti che ho letto quindi sono aperto alla correzione.

Questo avvisa grazie alle differenze nel JIT JavaScript. TraceMonkey (http://ejohn.org/blog/tracemonkey/) Credo che prenderà il JavaScript e fare una rapida analisi statica e quindi fare JIT e quindi provare ad eseguirlo. Se ciò fallisce, ovviamente nulla funziona.

V8 non esegue l'analisi statica e passa alla JIT, quindi esegue così qualcosa. È più simile al pitone. Se esegui lo script nella Console per gli sviluppatori (ctrl + maiusc + j in Windows) in Chrome, genera un errore ma viene eseguito anche per darti l'avviso.

+1

@Automater Tester, il tuo codice è perfettamente a posto ed è un bell'esempio di sollevamento in javascript. Ma quello che voglio sapere è che il ritorno non ha generato errori in chrome e safari. – alter

+0

@alter Ho aggiunto più informazioni per te. – AutomatedTester

+3

"In javaScript Le variabili vengono spostate all'inizio dello script e quindi eseguite." In realtà, i nomi * variabili * (e non le assegnazioni/definizioni) sono "issati" all'inizio dell'ambito di contenimento (qualunque sia il più vicino; 'if' et. Al. Do * not * crea un" ambito "in questo senso). – strager

3

Questo codice ha poco senso:

  • non sarà mai stato eseguito il var myVar1.
  • Il return false; non restituirà una cosa dato che non sei in una funzione

Opera, IE e FF hanno ragione a lanciare un errore perché il codice non è realmente valida in quanto non si è in grado di tornare a meno che tu non abbia una funzione.

Se funziona in Safari e Chrome, ciò deve essere dovuto al fatto che il motore javascript che utilizzano è pronto per gestire il codice buggato. La mia ipotesi sarebbe che vedono lo "return" e lo rilasciano o lo sostituiscono con qualche tipo di break.

ulteriori informazioni sulle funzioni: http://www.w3schools.com/js/js_functions.asp

+0

Errori di Chrome per me quando uso un'istruzione * return * al di fuori di una funzione. –

+3

var myVar1 verrà sempre eseguito grazie al sollevamento di – AutomatedTester

+0

indipendentemente dal fatto che l'istruzione di reso non sia consentita senza una funzione, la risalita dovrebbe essere avvenuta qui e avrei dovuto ricevere un avviso che diceva indefinito. Non vedo che ciò accada quando ho una dichiarazione di ritorno. – alter

10

Sezione 12.9 (pagina 75) di ECMA-262 edizione 3 stati:

An ECMAScript program is considered syntactically incorrect if it contains a return statement that is not within a FunctionBody.

Cioè, un return di fuori di una funzione è un errore di sintassi . Se si verifica un errore di sintassi , non viene eseguito alcun codice. Pensate al vostro esempio come se si fosse scritto:

alert(myVar1); 
return false; 
syntax error)))))))))))))))))); 

Inoltre, la sezione 16 (pagina 157) afferma:

An implementation may treat any instance of the following kinds of runtime errors as a syntax error and therefore report it early:

  • Improper uses of return, break, and continue.

di Firefox motore et. al. (Cioè quelli JavaScript implementazioni che consentono return nell'ambito globale) possono essere conformi, assumendo la seguente clausola (nella stessa sezione) consente la definizione attuazione return nell'ambito globale:

An implementation shall report all errors as specified, except for the following:

  • An implementation may provide additional types, values, objects, properties, and functions beyond those described in this specification. This may cause constructs (such as looking up a variable in the global scope) to have implementation-defined behaviour instead of throwing an error (such as ReferenceError).
0

Si è JavaScript sollevamento cosa, semplicemente in altre parole, stiamo cercando di stampa il valore della variabile, che non è in possesso di alcun valore

Javascript renderà il codice di cui sopra, come: -

var myVar1 
 
alert (myVar1) 
 
return false

Per chiarire più mi riferiti link javascript sollevamento: http://www.ufthelp.com/2014/11/JavaScript-Hoisting.html

11

volte sollevamento è spiegato in un modo che può dare un'impressione sbagliata, cioè le variabili e le funzioni vengono issate dal motore JavaScript come se fossero fisicamente spostati sulla parte superiore, che non è in realtà proprio, come dimostra il codice qui sotto:

console.log(a); 
var a = 'Hello World!'; 

Quello che vediamo sullo schermo è undefined, non 'Hello World', quindi abbiamo ottenuto la Beha vior del seguente codice

var a; 
console.log(a); 
a = 'Hello World!'; 

non il comportamento di

var a = 'Hello World!'; 
console.log(a); 

che si può avere l'impressione dalla dichiarazione variabili e funzioni viene spostato alla dichiarazione top.

Ma JavaScript non sta effettivamente spostando il codice da nessuna parte. Devi capire il contesto di esecuzione in JavaScript. Ha due fasi di fase di creazione e fase di esecuzione. Nella fase di creazione viene creato uno spazio di memoria per queste variabili e funzioni, e le persone sembrano confondere questo passaggio con il sollevamento. JavaScript non sta effettivamente spostando il tuo codice da nessuna parte, ciò che accade è che JavaScript ha creato spazio di memoria per tutto il codice, cioè variabili e funzioni, le funzioni possono essere posizionate completamente nella memoria, ma in caso di variabili le assegnazioni vengono elaborate in fase di esecuzione del contesto di esecuzione. Quindi, quando esegui var a = 'Hello World!', il motore JavaScript riconosce il valore di a quando inizia ad eseguirlo nella fase di esecuzione del contesto di esecuzione, quindi inserisce un segnaposto non definito e tutte le variabili inizialmente non sono definite in JavaScript. Quindi non è bene fare affidamento sul sollevamento e vedere indefinito. Quindi è sempre bene dichiarare variabili e funzioni in cima al tuo codice.

Problemi correlati