2017-08-05 2 views
1

Ich bereite für ein Vorstellungsgespräch als Entwickler JS und ich in diese Schließung Definition gestoßen:Ist eine Funktion im globalen Gültigkeitsbereich eine Sperrung?

Verschluss ist eine Funktion innerhalb eine andere Funktion definiert (das übergeordnete Funktion genannt), und Zugang hat zu Variablen, die im übergeordneten Funktionsumfang deklariert und definiert sind.

Lassen Sie uns zwei verschiedene Teile des Codes betrachten:

function a() { 
    const temp = 1; 

    function b() { 
     console.log(temp); 
    }   
} 

So offensichtlich funktionieren b ein Verschluss ist, weil es in Funktion a und Zugriff auf seine variable temp hat erklärt wurde.

Aber was, wenn ich erkläre nur eine Funktion einfach so, ohne IIFE:

function c() { 
    alert("Hi") // a function taken from the global scope 
} 

Meine c Funktion nicht in jeder Funktion deklariert wurde, aber es hat Zugriff auf den globalen Bereich. Kann es eine Schließung genannt werden, oder sollte es speziell innerhalb einer anderen Funktion erklärt werden, um eine solche zu nennen?

+2

Vielleicht sind einige Freak Fälle gibt es nennen ich nicht dachte, sondern afaik, technisch ist jede Funktion, die du deklarierst, eine Schließung. Sie nennen sie normalerweise nur so, dass Sie, wenn Sie betonen möchten, auf Variablen zugreifen, die im übergeordneten Bereich deklariert sind. – ASDFGerte

+0

Ein Abschluss hat drei Bereichsketten, es sind eigene definierte Variablen, die der umschließenden Funktion und die globalen Variablen. Ihr zweites Beispiel hat nur lokale und globale Umfangsketten, also nein, es ist kein Abschluss. – James

+1

Ich bin nicht gut genug in der Spezifikation, um sicher zu sein, über meine Antwort. Von dem, was ich gelesen habe [ECMAScript-Funktionsobjekte kapseln den parametrisierten ECMAScript-Code ** geschlossen über ** eine lexikalische Umgebung und unterstützen die dynamische Auswertung dieses Codes.] (Https://www.ecma-international.org/ecma-262/ 8.0/index.html # sec-ecmascript-function-objects) [Eine globale Umgebung ist eine Lexikalische Umgebung, die keine äußere Umgebung hat.] (Https://www.ecma-international.org/ecma-262/8.0/ index.html # sec-lexical-environments) [MDN-Definition] (https://developer.mozilla.org/en/docs/Web/JavaScript/Closures) – ASDFGerte

Antwort

2

Kann es einen Verschluss

Ja genannt werden, obwohl ich würde sagen, es einen Verschluss erzeugt (auf die Variablen in ihren äußeren Ausführungskontexten) eher, dass „ist“ ein Verschluss.

oder sollte es speziell in einer anderen Funktion deklariert werden, um eine

Nr

Duplizieren von How do JavaScript closures work?

+0

So klar ist die Definition, der ich begegnete, falsch, richtig? –

+1

@ AdrianWydmanski-ja. Closures werden normalerweise im selben Kontext wie der Artikel [* Private Member in JavaScript *] (http://javascript.crockford.com/private.html) von Douglas Crockford eingeführt. Obwohl dieser Aspekt von Schließungen am interessantesten ist (d. H. Ihre Fähigkeit besteht über die Lebensdauer der Funktion hinaus, die sie erzeugt), ist dies keine notwendige Bedingung für ihre Schaffung. – RobG

Verwandte Themen