2017-01-09 3 views
-2

An welchem ​​Punkt würde die globale Variable in der folgenden Funktion unten erstellt werden? bevor test() ausgeführt wird oder nach?Javascript: Wann wird global erstellt?

var test = function(){ 
    foo = 5 
} 

test() 

Edit: Ich beziehe mich auf variable

+1

Es wäre hilfreich, wenn Sie klären könnten, ob Sie neugierig auf 'test' oder' foo' sind. – Pointy

+0

@Pointy, ich denke, er fragt nach 'foo', da es ohne' var' erstellt wurde und dafür gedacht ist global zu sein –

+0

Es wäre immer noch gut, das tatsächlich zu sagen. –

Antwort

3

..before test() ausgeführt foo oder nach?

Es hängt davon ab, welche globale Variable Sie beziehen, test oder foo.

Für test: Vorher. var Deklarationen werden "gehisst", sie werden verarbeitet, bevor ein Schritt-für-Schritt-Code in dem Bereich, in dem sie angezeigt werden, ausgeführt wird; Globale werden vor jedem Schritt-für-Schritt-Code im globalen Umfang in diesem Skript ausgeführt. (Nachfolgende Skripte werden separat behandelt, zuerst vars, dann Schritt-für-Schritt-Code.)

Für foo: Während.

Die Reihenfolge dieser Code ist:

  1. Erklärungen auftreten:
    1. Die globale test wird mit dem Wert undefined erstellt.
  2. Schritt-für-Schritt-Ausführung erfolgt:
    1. Die Zuordnung test = function() { foo = 5 } wird ausgeführt
      1. Die Funktion erstellt wird
      2. zugeordnet ist, zu test
    2. test() ausgeführt wird
      1. Die Zuordnung foo = 5 erfolgt, wodurch ein implizite globale genannt foo (mehr auf meinem Blog: The Horror of Implicit Globals)
2

Die Variable foo wird erstellen, wenn ein Dolmetscher zugewiesen werden versuchen, die Variable foo, also während der Ausführung der Funktion.

var test = function(){ 
    foo = 5 
} 

window.hasOwnProperty('foo'); // false 

test() 

window.hasOwnProperty('foo'); // true 
2

Dies ist leicht genug, um zu testen:

// The code within the function won't be evaluated (nor any variables within it be hoisted) 
 
// until that code is invoked 
 
var test = function(){ 
 
    foo = 5; 
 
} 
 

 
// This will fail saying that foo is undefined, so we know that the global 
 
// hasn't been created yet 
 
//console.log(foo); 
 

 
// Call the function and force the code within it to be evaluated 
 
test() 
 

 
// Works. The global has been created.. 
 
console.log(foo);

+1

Sie können sicher 'console.log (typeof foo)' verwenden, um zu sehen, ob es erstellt wurde (wird "undefined" vor und "number" nach). Auch 'this.hasOwnProperty (" foo ")' (oder 'window.hasOwnProperty (" foo ")'). –

+0

@ T.J.Crowder Ja, aber ich habe es aus zwei Gründen so gezeigt. 1) das Erhalten des Fehlers ist ziemlich überzeugender Beweis dafür, dass die Variable nicht erstellt wird, und 2) es ist der einfachste Test, der durchgeführt wird. –

+0

* "das Ermitteln des Fehlers ist ein ziemlich überzeugender Beweis dafür, dass die Variable nicht erstellt wurde" * :-D Richtig! –

0

Hier im Code

var test = function(){ foo = 5}; 
    test(); 

Test ist die globale Variable, die das Objekt Funktion hält . Sie wird vor dem Funktionsaufruf test() während der globalen Ausführungsumgebung erstellt.

foo ist auch globale Variable, da kein var, let oder const Schlüsselwort da ist. Aber es wird nach dem Aufruf der Funktion test() erstellt.

+0

'foo' ist keine lokale Variable - sie ist global und bleibt bestehen, nachdem' test() 'zurückkommt. Ein Beispiel finden Sie in meinem Code-Ausschnitt. –

+0

@ Scott du bist richtig, ich habe übersehen, dass es keine var, lassen oder const Schlüsselwort –

+1

@RafiqueAhmed Ziemlich große Sache, die Sie "übersehen" - das war die Frage ... – Li357

Verwandte Themen