2015-05-26 10 views
8

Hi Leute hier Ich habe eine einfache Funktion und eine globale Variable.Warum eine Variable definiert global ist undefiniert?

Warum ist mynameundefined und nicht die Zeichenfolge "global"?

var myname = "global"; // global variable 
function func() { 
    alert(myname); // "undefined" 
    var myname = "local"; 
    alert(myname); // "local" 
} 
func(); 

ist nicht möglich, auf eine äußere Variable zu bezeichnen, die außerhalb des Umfangs dieser Funktion ist definiert? und in diesem eine globale Variable ...

Und wie ich dieses Problem beheben kann, damit ich nicht ein undefined von einer globalen Variablen bekommen?

+0

Ich denke, Sie haben 'var' auf der globalen Variablen vergessen – crc442

+0

Ich glaube @ Crc442 ist richtig. Können Sie Ihre Fehlermeldung zur Bestätigung posten? – mas4

+0

@ crc442 - ich glaube, Sie wissen nicht, worüber Sie reden –

Antwort

19

Sie haben stolperte auf einer js „Feature“ genannt

var myname = "global"; // global variable 
function func() { 
    alert(myname); // "undefined" 
    var myname = "local"; 
    alert(myname); // "local" 
} 
func(); 

In diesem Code Hissen, wenn Sie func der Compiler in der Funktion Körper sieht definieren. Sie sehen, dass Sie eine Variable namens myname deklarieren.

Javascript Hoists Variable und Funktionsdeklarationen, durch die Erklärung an die Spitze der Funktion zu bewegen.

Wegen des Hochfahrens wird Ihr Code in das Folgende geschrieben.

Diese "Deckt" die globale Variable. Wenn Sie im Rahmen einer Funktion auf die globale Variable zugreifen möchten, verwenden Sie das Schlüsselwort this.

var myname = "global"; // global variable 
function func() { 
    var myname = "local"; 
    alert(this.myname); // "global" 
    alert(myname); // "local" 
} 
func(); 

Beachten Sie, dass dies nur funktioniert, in einer Funktion keine Methode oder Konstruktor aufrufen, weil das this Schlüsselwort ändert, was zu seiner gebundenen je nachdem, wie Sie eine Funktion aufrufen.

EDIT: Für Vollständigkeit

Wenn Sie Zugriff auf globale Variablen in jedem Kontext erhalten möchten, unabhängig von Funktion Typ dann eine globale Variable erklären, dass Sie nie abdecken durch Konvention.

var global = this; // in global scope. 
var myname = "global"; 
var obj = {f: function() { 
    var myname = "local"; 
    console.log(global.myname); 
}}; 
obj.f(); // "global" 

Hinweis, dass diese in Verfahren Position befindet und die this Schlüsselwort bezieht sich direkt auf obj und muss daher nicht myname definiert.

+0

das ist die richtige Antwort, ich war falsch –

+0

Danke für die Erklärung. Es macht Sinn. Ich habe jedoch eine Frage. Warum wurde die Deklaration in der 3. Zeile der Funktion von der Zuweisung getrennt? – codingpuss

+1

@codingpuss hosting bewegt sich nicht, wo die Zuweisung passiert. Es erstellt nur eine Kopie der Variablen, die in der Funktion benötigt werden, und deklariert sie oben. – t3dodson

3

Innerhalb einer Funktion, du erklären Sie var myname = "local". Auch wenn Sie es in der Mitte der Methode tun, hat diese Variable den Funktionsumfang, also gehört sie zur gesamten Funktion, sogar der Code darüber.

also wird die lokale Wert der Variablen vor dieser Zeile nicht definiert, und hat nach dem Wert, aber keiner der globalen Variable berühren.

+0

Ich glaube nicht, dass dieser Teil Ihrer Antwort präzise ist: "Also ist der Wert der lokalen Variablen vor dieser Zeile undefiniert ...". Die var-Anweisung wird nach oben in Javascript (histing) verschoben, so dass es vor jedem anderen Code innerhalb seiner Punktzahl ausgeführt wurde (in diesem Fall die Funktion) – codingpuss

0

Der Grund der erste Alarm ist nicht definiert ist, weil Sie global als lokaler Variable darunter in der Funktion deklarieren sind. Und in Javascript, das heißt von der Spitze der Funktion wird es als die lokale Variable betrachtet.

Der darunterliegende funktioniert, weil gerade über der Warnung gab es einen Wert.

-1

Sie vergessen „var“ in der ersten Zeile:

var myName = "global"; 

Hoisting bezieht sich lediglich auf die Tatsache, dass Javascript geht durch und setzt alle Variablen, die nicht definiert auf den Wert initialisiert werden (kein String)

+0

Siehe die Kommentare zum OP – mas4