Frage

Heute hatte ich eine Diskussion mit einem Kollegen über verschachtelte Funktionen in Javascript:

function a() {
   function b() {
      alert('boo')
   }
   var c = 'Bound to local call object.'
   d = 'Bound to global object.'
}

In diesem Beispiel Studien weisen darauf hin, dass b nicht erreichbar ist außerhalb des Körpers von einem, ähnlich wie c ist.Aber d ist - nach dem ausführen einer().Auf der Suche nach der genauen definition zu diesem Verhalten in der ECMAScript v. 3 standard , Ich habe nicht den genauen Wortlaut ich war auf der Suche nach;was S 13 p.71 nicht sagen, welches Objekt die Funktion Objekt erstellt, indem die Deklaration der Funktion-Anweisung gebunden werden.Bin ich etwas fehlt?

War es hilfreich?

Lösung

Dies ist die statische Festlegung des lösungsumfangs.Anweisungen innerhalb einer Funktion den Gültigkeitsbereich innerhalb dieser Funktion.

Javascript hat ein eigenartiges Verhalten, aber das ist, ohne die var Stichwort Sie haben eine STILLSCHWEIGENDE Globale variable.Das ist, was Sie sehen in Ihren test durch.Ihre "d" - variable vorhanden ist, weil es ist eine implizite Globale, obwohl geschrieben innerhalb der Körper der Funktion.

Auch eine Antwort auf den zweiten Teil deiner Frage:Eine Funktion vorhanden ist, in welchem Umfang er deklariert ist, genau wie eine variable.

Sidenote: Sie möchten wahrscheinlich nicht, dass Globale Variablen, insbesondere keine STILLSCHWEIGENDE lieben.Es wird empfohlen, dass Sie immer das var-Schlüsselwort verwenden, um Verwirrung zu vermeiden und halten alles sauber.

Sidenote: Der ECMA-Standard ist nicht wahrscheinlich die meisten hilfreich finden, um Antworten zu Javascript, obwohl es ist sicherlich keine schlechte Ressource.Denken Sie daran, dass javascript in Ihrem browser nur eine Implementierung des Standards, so dass die standards Dokument werden Ihnen die Regeln waren (größtenteils), gefolgt von der implementors, wenn die javascript-engine gebaut wurde.Es kann nicht bieten spezifische Informationen zu den Implementierungen, die Sie interessieren, nämlich den gängigen Browsern.Es gibt ein paar Bücher, die insbesondere die Ihnen sehr direkten Informationen darüber, wie Sie die javascript-Implementierungen in den gängigen Browsern verhält.Um die Unterschiede zu beleuchten, werde ich Auszüge unten von beiden der ECMAScript-Spezifikation, und ein Buch über Javascript.Ich denke, Sie werden mir Zustimmen, dass das Buch bietet eine mehr direkte Antwort.

Hier ist, aus der ECMAScript Language Specification:

10.2 Die Eingabe Eines Ausführungskontexts

Jede Funktion und Konstruktor-Aufruf in einen neuen Kontext für die Ausführung, auch wenn eine Funktion ruft sich selbst rekursiv.Jeder Rückkehr beendet eine Ausführungskontext.Eine Ausnahme geworfen, wenn Sie nicht erwischt, kann auch den Ausgang ein-oder mehr ausführungskontexte.

Wenn die Kontrolle tritt ein Ausführungskontext, der Umfang die Kette wird erstellt und initialisiert, variable Instanziierung durchgeführt wird, und dieser Wert bestimmt wird.

Die Initialisierung der scope-Kette, variable Instanziierung und der Bestimmung der diesem Wert abhängen auf die Art der code eingegeben werden.

Hier ist von O 'Reilly' s Javascript:The Definitive Guide (5th Edition):

8.8.1 Lexikalische Scoping

Funktionen in JavaScript sind lexikalisch anstatt dynamisch scoped.Diese bedeutet, dass Sie laufen in dem Bereich, in dem Sie definiert sind, nicht der Umfang aus denen Sie ausgeführt werden.Wenn ein Funktion definiert ist, wird der aktuelle Bereich die Kette ist gespeichert und wird ein Teil von den internen Zustand der Funktion....

Sehr zu empfehlen für die Abdeckung, diese Art von Fragen ist Douglas Crockford ' s book:

JavaScript-Die Guten Teile http://oreilly.com/catalog/covers/9780596517748_cat.gif

Javascript-Die Guten Teile, auch von O ' Reilly.

Andere Tipps

Wie ich es verstehe, diese gleichwertig sind so weit wie Scoping betrifft:

function a() { ... }

und

var a = function() { ... }

Es scheint wichtig zu beachten, dass, während d als „global“ erstellt wird, ist es in Wirklichkeit ist, als eine Eigenschaft des Window-Objekts erstellt wird. Dies bedeutet, dass Sie versehentlich etwas werden überschreiben könnte, die auf dem Fensterobjekt oder Ihre Variable scheitern könnte bereits existiert eigentlich gar geschaffen werden. Also:

function a() {
    d = 'Hello World';
}
alert(window.d); // shows 'Hello World'

Sie können aber nicht tun:

function a() {
    document = 'something';
}

, weil Sie das window.document Objekt nicht überschreiben können.

Für alle praktischen Zwecke können Sie die Abbildung, dass alle Ihre Code wird in einem riesigen with(window) Block ausgeführt wird.

Javascript hat zwei Bereiche. Global, und funktional. Wenn Sie eine Variable innerhalb einer Funktion mit dem „var“ Keyword erklären, wird es zu dieser Funktion, und alle inneren Funktionen lokal sein. Wenn Sie eine Variable außerhalb einer Funktion deklarieren, hat es globalen Bereich.

Schließlich , wenn Sie das Schlüsselwort var weglassen, wenn zunächst eine Variable deklarieren, Javascript vorausgesetzt, dass Sie eine globale Variable wollte, egal, wo Sie erklären es .

Also, Sie anrufen Funktion ein, und die Funktion a ist eine globale Variable d deklarieren.

...

function a() {
   function b() {
      alert('boo')
   }
   var c = 'Bound to local call object.'
   d = 'Bound to global object.'
}

, ohne durch vorgeschaltet ist var , d ist global. Tun Sie dies gemacht d privat:

function a() {
   function b() {
      alert('boo')
   }
   var c = 'Bound to local call object.'
   var d = 'Bound to local object.'
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top