Heim > Artikel > Web-Frontend > Das Konzept des Abschlusses in js
Verschlüsse gibt es nicht nur bei JavaScript, die meisten Hochsprachen verfügen über diese Fähigkeit.
Ein Abschluss ist die Kombination einer gebündelten (eingeschlossenen) Funktion mit Verweisen auf ihren umgebenden Zustand (die lexikalische Umgebung).
dies Segment ist die Definition eines Abschlusses auf MDN, der wie folgt verstanden wird: Eine Funktion und ihre umgebenden Referenzen in der geschlossenen lexikalischen Umgebung bilden einen Abschluss. Vielleicht ist dieser Satz immer noch schwer zu verstehen:
function createAction() { var message = "封闭环境内的变量"; return function() { console.log(message); } } const showMessage = createAction(); showMessage(); // output: 封闭环境内的变量
Dieses Beispiel ist ein typischer Abschluss. Es gibt mehrere Punkte zu beachten:
showMessage
Ja 🎜>Eine createAction
Funktion , die nach der Ausführung davon zurückgegeben wurde.
createAction
, da eine Variable in dieser gekapselten Umgebung niemals direkt von außen zugänglich ist. message
showMessage
ausgeführt, aber auf die darin definierte lokale Variable createAction
wird während der Ausführung zugegriffen (erfolgreiche Ausgabe). Dies liegt daran, dass die Funktion, auf die durch message
verwiesen wird (die anonyme Funktion in showMessage
), bei ihrer Definition an die Referenzen (createAction
usw.) in der lexikalischen Umgebung (in createAction
) gebunden ist, in der sie sich befindet . message
return
-Umgebung gebracht, die einen Abschluss bildet. Wenn es innerhalb von createAction
aufgerufen wird, gilt es nicht als Abschluss. createAction
Denken Sie also nicht, dass „Sie“ den Abschluss erstellt haben, denn Abschlüsse sind eine Sprachfunktion, Sie haben diese Funktion einfach ausgenutzt .
Wenn die Sprache keine Abschlüsse unterstützt, ähnlich wie im obigen Code, wird die Variable bei der Ausführung von showMessage
nicht gefunden. Ich möchte vor allem ein Beispiel finden, aber leider scheinen alle mir bekannten Hochsprachen Abschlüsse zu unterstützen, solange Funktionen innerhalb von Funktionen/Methoden definiert werden können. message
herausbringen können. return
function encase(aCase) { const dog = "狗狗"; const cat = "猫猫"; aCase.show = function () { console.log(dog, cat); }; } const myCase = {}; encase(myCase); myCase.show(); // output: 猫猫 狗狗Fällt Ihnen etwas ein? Module und VerschlüsseJa, Exporte und module.exports. In dem von CJS (CommonJS) definierten Modul können Sie
verwenden, um Waren einzeln zu bringen, oder Sie können exports.something
verwenden, um Waren zu verpacken, aber egal was passiert, module.exports = ...
ist derjenige, der Waren bringt, aber Möglicherweise wurde das ursprünglich arrangierte exports
durch eines unserer eigenen exports
ersetzt. exports
und import
, was nur eine weitere Möglichkeit ist, Waren hervorzubringen. Der einzige Unterschied besteht darin, dass export
Sie können nur eins mitbringen (es sei denn, es ist verpackt), return
Sie können ein Bündel mitbringen. return
export
Es sollte auch hinzugefügt werden, dass das Modul unabhängig davon, ob es sich um CJS oder ESM handelt, eine gekapselte Umgebung ist und die darin definierten Dinge für außen nicht zugänglich sind, solange sie nicht herausgenommen werden. Dies unterscheidet sich von der standardmäßigen globalen Umgebung von Webskripten. Bitte beachten Sie den Unterschied.
Wenn es im Code ausgedrückt wird, ist das wahrscheinlich das, was ich gedacht habe, als ich das Modul definiert habe:
const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { }
In der laufenden Umgebung sieht es tatsächlich so aus (Hinweis: nur zur Veranschaulichung):
// module factory function createModule_18abk2(exports, module) { const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { } } // ... 遥远的生产线上,有这样的示意代码 const module = { exports: {} }; const m18abk2 = createModule_18abk2(module) ?? module; // 想明白 createModule_18abk2 为什么会有一个随机后缀没?
Ist es immer noch die gleiche Funktion?
Versuchen Sie es mit:
function create() { function closure() { } return closure; } const a = create(); const b = create(); console.log(a === b); // false
Wenn Sie überrascht sind, definieren Sie
auf andere Weise, um zu sehen, ob es leichter zu verstehen ist:function create() { closure = function() { } return closure; }
closure()
Wenn Sie es noch können' Ich verstehe es nicht, versuche es noch einmal. Schau dir das an: function create() { const a = function () { }; const b = function () { }; console.log(a === b); // false }
Verstehst du? Jedes Mal, wenn
eine neue Funktion definiert. Die Funktion ist neu und der Name ist nicht wichtig – Sie können sie Xiao Ming nennen, aber andere können sie auch Xiao Ming nennen.function
Also, um es zusammenzufassen:
Abschluss, dieses Mal habe ich es herausgefunden!
Empfohlenes Tutorial: „Das obige ist der detaillierte Inhalt vonDas Konzept des Abschlusses in js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!