2013-02-02 8 views
16

Das Schlüsselwort var in JavaScript bewirkt, dass eine Variable im lokalen Bereich gespeichert wird. Ohne var gehören Variablen zum globalen Gültigkeitsbereich. Was ist mit Funktionen? Es ist klar, was passiert, wenn Funktionen wie Variablen deklariert werdenJavaScript-Bereich der Funktionsdeklarationen

var foo = function() {...} 

aber was Umfang tut

function foo() {...} 

gehören?

EDIT: Ich erkannte, dass ich nicht die richtige Frage als Follow-up gefragt habe. In der äußersten Verschachtelung gibt es einen Unterschied zwischen den obigen zwei Deklarationen und der folgenden Deklaration?

foo = function() {...} 

Antwort

25

Es gehört zu den aktuellen Umfang, immer. Zum Beispiel:

// global scope 

// foo is a global function 
function foo() { 

    // bar is local to foo 
    function bar() { 

    } 

} 

In Bezug auf Ihre zweite Frage betrifft, so:

foo = function() {...} 

ist eine anonyme Funktion Ausdruck einer globalen Variablen zugewiesen (es sei denn, Sie ist streng Modus ausgeführt wird, dann würde foo nicht definiert) . Der Unterschied zwischen diesem und function foo() {} ist, dass letztere eine Funktion Erklärung (im Vergleich zu einer variable Erklärung, die eine anonyme Funktion Ausdruck zugeordnet ist).

Sie könnten sich für diesen ausgezeichneten Artikel über Funktionsdeklarationen und Funktionsausdrücke interessieren: Named function expressions demystified.

+0

Das ist ein großartiger Artikel. Vielen Dank. – user1816847

+1

Ein bemerkenswerter Unterschied, den ich vergessen habe zu erwähnen, ist das, was Bergi in seiner Antwort sagte: Funktionsdeklarationen werden gehisst, so dass Sie die Funktion aufrufen können, bevor sie tatsächlich im Quellcode erscheint. – bfavaretto

0

Ihr erstes Beispiel (var foo = function() {...}) wird anonyme Funktion genannt. Es wird zur Laufzeit dynamisch deklariert und folgt nicht den Regeln einer normalen Funktion, sondern den Regeln der Variablen.

+0

Das ist wirklich verwirrend, weil eine Menge Dokumentation sagt Dinge wie "Funktionen sind erstklassige Objekte" ohne eine genauere Diskussion über die Unterscheidung, die ich im OP erwähnt. – user1816847

7

Funktionsdeklarationen sind immer lokal für den aktuellen Bereich, wie eine Variable, die mit dem Schlüsselwort var deklariert wurde.

Allerdings ist der Unterschied, dass, wenn sie erklärt (statt einer Variablen zugewiesen) ihre Definition ist gehisst, so werden sie in den Geltungsbereich auch überall einsetzbar, wenn die Erklärung am Ende der kommt Code. Siehe auch var functionName = function() {} vs function functionName() {}.

3

Noteworthy Unterscheidung unter implizite Globals berücksichtigt:

var foo = function() { 
    // Variables 
    var myVar1 = 42; // Local variable 
     myVar2 = 69; // Implicit global (no 'var') 

    // Functional Expressions 
    var myFn1 = function() { ... } // Local 
     myFn2 = function() { ... } // Implicit global 

    function sayHi() { 
    // I am a function declaration. Always local. 
    } 
} 

Hoffentlich, die ein wenig verdeutlicht. Implizite Globals werden definiert, wenn Sie vor Ihrer Zuweisung eine var vergessen haben. Es ist eine gefährliche Gefahr, die für Variablendeklarationen und Funktionsausdrücke gilt.

Verwandte Themen