2017-11-10 5 views
-1

Fall 1: Der folgende Code alarmiert , wie es sollte:Wann haben globale Variablen Vorrang vor Funktionsumfang in JavaScript?

var globalId='10'; 
function check(){ 
    alert(globalId); 
} 
check(); 

Fall 2: aber diese nächste Code-Benachrichtigungen undefined:

var globalId='10'; 
function check(){ 
    alert(globalId); 
    var globalId; 
} 
check(); 

Für Fall 2 die Lösung ist:

var globalId='10'; 
function check(){ 
    var globalId; /**moved to top of the function due to hoisting and has an initial value of undefined. Hence, alert(globalId) return undefined. **/ 

alert(globalId); //undefined 
var globalId; 
} 
check(); 

Meine Frage ist jetzt, wie geht in Fall 1 globalId den Wert von 10 hat?

+0

Wenn es keine lokale gibt, beginnt es nach außen zu schauen, bis es zu Globals kommt. – dandavis

+0

Weil Sie im ersten Fall keine Scope-Level-Variable deklariert haben. –

+0

Weil Sie die Variable var im Case 2 mit dem Präfix 'var' innerhalb der Funktion ... – pirs

Antwort

1

Niemals. In JavaScript haben Variablen, die im aktuellen Funktionsbereich deklariert sind, immer Vorrang vor Variablen, die im äußeren Bereich deklariert sind.

In Ihrem zweiten Beispiel

var globalId='10'; 
function check(){ 
    alert(globalId); 
    var globalId; 
} 
check(); 

Der Dolmetscher Ihre var globalId Erklärung nach oben für Sie automatisch bewegt, was dazu führt:

var globalId='10'; 
function check(){ 
    var globalId; 
    alert(globalId); 
} 
check(); 

und das ist, warum es undefined zeigt.

+0

Ich glaube nicht, der Dolmetscher bewegt nichts.Beim Erstellen eines Ausführungskontextes werden zuerst die Funktions- und Variablendeklarationen verarbeitet, dann wird der Code ausgeführt, weshalb deklarierte Variablen und Funktionen vor der Codeausführung existieren. Ich mag den Begriff "hissen" nicht, weil er darauf hinweist, dass der Code verschoben wurde. – RobG

+0

@RobG Der Begriff "bewegt" wird verwendet, weil es einfacher zu verstehen ist. Sie sind absolut richtig, dass die Linie nicht physisch bewegt wird (Sie sind schließlich RobG;)), aber alle Variablendeklarationen werden vor irgendetwas anderem in ihrem Kontext durchgeführt. –

0

Meine Frage ist jetzt, wie in Fall 1 hat globalId den Wert von 10?

Da

  • In JavaScript sind variabel Funktion (wenn mit var deklariert) oder Block scoped (wenn let oder const deklariert).
  • Und Sie haben nicht den Geltungsbereich der Variablen mit var, let oder const lokalisiert.

So verwendet es den Bereich, in dem die Funktion check definiert ist.

Verwandte Themen