Heim > Artikel > Web-Frontend > Eine kurze Diskussion zu Umfangs- und Abschlussproblemen in JavaScript_Grundkenntnisse
Der Umfang von JavaScript ist durch Funktionen begrenzt, und verschiedene Funktionen haben relativ unabhängige Bereiche. Globale Variablen können innerhalb der Funktion deklariert und darauf zugegriffen werden, und lokale Variablen können ebenfalls deklariert werden (mit dem Schlüsselwort var sind die Parameter der Funktion ebenfalls lokale Variablen), auf interne lokale Variablen kann jedoch nicht außerhalb der Funktion zugegriffen werden:
function test() { var a = 0; // 局部变量 b = 1; // 全局变量 } a = ?, b = ? // a为undefined,b为1
Lokale Variablen mit demselben Namen überschreiben globale Variablen, aber im Wesentlichen handelt es sich um zwei unabhängige Variablen. Änderungen in einer haben keinen Einfluss auf die andere:
a = 5; // 函数外a的值为5 function test() { var a = 4; // 函数内a的值为4 }(); a = ? // 函数外a的值仍为5,不受函数影响
Im Allgemeinen werden nach Beendigung der Funktion alle Verweise auf die internen Variablen der Funktion beendet, die lokalen Variablen innerhalb der Funktion werden recycelt und die Ausführungsumgebung der Funktion wird gelöscht Wird es als Rückgabeergebnis der Funktion verwendet, ändert sich die Situation:
function test(i) { var b = i * i; return function() { return b--; }; } var a = test(8); a(); // 返回值为64, 内部变量b为63 a(); // 返回值为63, 内部变量b为62
Wenn eine interne Funktion als Rückgabewert verwendet wird, können die lokalen Variablen der Funktion nicht recycelt werden, da der Verweis auf die interne Variable nach Beendigung der Funktion nicht endet und die Ausführungsumgebung der Funktion somit erhalten bleibt Es bildet einen Abschlusseffekt, der übergeben werden kann. Referenzzugriff auf interne Variablen, die recycelt werden sollen.
Durch den Abschluss werden auch die lokalen Variablen der Funktion zu „privaten“ Variablen, auf die nur über die zurückgegebene innere Funktion zugegriffen werden kann und die auf keine andere Weise geändert werden können.
Daher können Abschlüsse verwendet werden, um lokale Variablen zu verwalten und Variablen zu schützen.
Ohne Verschluss:
var a = []; // 假设a中包含5个元素 for (var i = 0, m = a.length; i < m; i++) { a[i].onclick = function(e) { return 'No. ' + i; }; } // 点击任何一个元素,返回值都是“No. 5”,因为i最后的值为5 使用闭包的情况: function test(i) { return function(e) { return 'No. ' + i; }; } var a = []; // 假设a中包含5个元素 for (var i = 0, m = a.length; i < m; i++) { a[i].onclick = test(i); } // 使用闭包维持局部变量,点击元素返回No. 0 ~ No. 4
Während Verschlüsse Bequemlichkeit bringen, bringen sie auch einige Nachteile mit sich:
1. Die Komplexität des Programms nimmt zu und es wird schwieriger zu verstehen
2. Komplexe Schließungen beeinträchtigen die normale Speicherbereinigung und können auch dazu führen, dass der Speicher nicht recycelt werden kann und abstürzt
3. Große Schließungen gehen oft mit Leistungsproblemen einher
Daher sollten Verschlüsse kompakt und kompakt sein und nicht groß und komplex, und eine großflächige Verwendung von Verschlüssen sollte vermieden werden. Das Auftauchen von Abschlüssen ist an sich ein Fehler in der Sprache, bleibt aber aufgrund ihrer einzigartigen Funktionen bestehen. Es handelt sich um ein ergänzendes Mittel, nicht um die Hauptfunktion.