الإغلاق هو صعوبة في لغة JavaScript وميزةها. تعتمد العديد من التطبيقات المتقدمة على عمليات الإغلاق للتنفيذ.
الإغلاق لها ثلاث خصائص:
1. الوظائف المتداخلة
2. يمكن أن تشير الوظيفة إلى المعلمات والمتغيرات الخارجية في الداخل
3. لن يتم جمع المعلمات والمتغيرات بواسطة آلية جمع القمامة
تشير عمليات الإغلاق إلى الوظائف التي لديها إمكانية الوصول إلى المتغيرات في نطاق وظيفة أخرى. الطريقة الأكثر شيوعًا لإنشاء عمليات الإغلاق هي إنشاء وظيفة أخرى داخل وظيفة واحدة والوصول إلى المتغيرات المحلية لهذه الوظيفة من خلال وظيفة أخرى.
هناك ميزة لاستخدام عمليات الإغلاق ، وهي أيضًا عيب في ذلك ، وهي أنه يمكن أن يقيم المتغيرات المحلية في الذاكرة وتجنب استخدام المتغيرات العالمية. المتغيرات العالمية قابلة للاتصال في كل وحدة ، والتي لا بد أن تكون كارثية.
لذلك ، يوصى باستخدام متغيرات محلية خاصة مغلفة.
بعد تنفيذ الوظيفة العامة ، يتم تدمير الكائن النشط المحلي ، ويتم حفظ النطاق العالمي فقط في الذاكرة. لكن وضع الإغلاق مختلف!
إغلاق للوظائف المتداخلة:
الدالة AAA () {var a = 1 ؛ function function () {Alert (a ++)} ؛ } var fun = aaa () ؛ متعة () ؛ // 1 بعد التنفيذ A ++ ، ثم لا يزال A في ~ متعة () ؛ // 2 متعة = null ؛ // a إعادة تدوير! !نتيجة الإخراج أعلاه هي 5 ؛
ستحافظ عمليات الإغلاق على المتغيرات في الذاكرة طوال الوقت ، وإذا تم استخدامها بشكل غير صحيح ، فستزيد من استهلاك الذاكرة.
مبدأ جمع القمامة في جافا سكريبت
(1) في JavaScript ، إذا لم يعد هناك كائن ما ، فسيتم إعادة تدوير الكائن بواسطة GC ؛
(2) إذا كان كائنين يشيران إلى بعضهما البعض ولم يعد يتم الإشارة إليهما من قبل الشخص الثالث ، فسيتم إعادة تدوير هذين الكائنين إلى بعضهما البعض.
إذن ما هي فوائد استخدام الإغلاق؟ فوائد استخدام الإغلاق هي:
1. آمل أن يتمركز متغير في الذاكرة لفترة طويلة
2. تجنب تلوث المتغيرات العالمية
3. وجود أعضاء من القطاع الخاص
1. تراكم المتغيرات العالمية
<script> var a = 1 ؛ function abc () {a ++ ؛ التنبيه (a) ؛} abc () ؛ // 2abc () ؛ // 3 </script>2. المتغيرات المحلية
<script> function abc () {var a = 1 ؛ A ++ ؛ التنبيه (a) ؛} abc () ؛ // 2abc () ؛ // 2 </script>فكيف يمكن تحقيق المتغير A أن كلا المتغير المحلي ويمكن تجميعه؟
3. تراكم المتغيرات المحلية (يمكن أن تفعل الإغلاق)
<script> function Outer () {var x = 10 ؛ الإرجاع دالة () {// دالة الدالة المتداخلة x ++ ؛ تنبيه (x) ؛ }} var y = Outer () ؛ // يتم تعيين الوظيفة الخارجية للمتغير y ؛ y () ؛ // y وظيفة تسمى مرة واحدة ، والنتيجة هي 11y () ؛ // y وظيفة تسمى في المرة الثانية ، والنتيجة هي 12 ، وإدراك التراكم </script>إعلانات الوظيفة وتعبيرات الوظيفة في JS:
في JS يمكننا إعلان وظيفة من خلال وظيفة الكلمة الرئيسية:
<script> function ABC () {Alert (123) ؛} ABC () ؛ </script>يمكننا أيضًا استخدام "()" لتحويل هذا الإعلان إلى تعبير:
<script> (function () {Alert (123) ؛}) () ؛ // ثم اتصل مباشرة بالتعبير السابق من خلال () ، وبالتالي لا يتعين على الوظيفة كتابة اسم ؛ </script>4. رمز معياري لتقليل تلوث المتغيرات العالمية
<script> var abc = (function () {// ABC هي قيمة الإرجاع للدالة الخارجية المجهولة Var a = 1 ؛ function function () {a ++ ؛ Alert (a) ؛}}) () ؛ abc () ؛ // 2 ؛ استدعاء وظيفة ABC مرة واحدة هو في الواقع استدعاء قيمة الإرجاع للوظيفة الداخلية ABC () ؛ // 3 </script>5. وجود أعضاء من القطاع الخاص
<script> var aaa = (function () {var a = 1 ؛ function bbb () {a ++ ؛ Alert (a) ؛} function ccc () {a ++ ؛ alert (a) ؛} return {b: bbb ، // json structure c: ccc}}}) () ؛ aaa.b () ؛ //2aaa.c () // 3 </script>6. أوجد فهرس العنصر المقابل مباشرة في الحلقة
<! doctype html public "-// w3c // dtd xhtml 1.0 transitional // en" xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "en"> <head> <meta http-equiv = "content-type =" text/html ؛ charset = utf-8 "/> <title> document.getElementSbyTagname ('li') ؛ لـ (var i = 0 ؛ i <ali.length ؛ i ++) {ali [i] .onclick = function () {// عند النقر عليه ، انتهت الحلقة من أجل التنبيه (i) ؛ } ؛ }} </script> </head> <body> <ul> <li> <li> 123 </li> <li> 456 </li> <li> 789 </li> <li> 010 </li></ul> </body> </html>7. استخدم الإغلاق لإعادة كتابة الرمز أعلاه:
<! doctype html public "-// w3c // dtd xhtml 1.0 transitional // en" xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "en"> <head> <meta http-equiv = "content-type =" text/html ؛ charset = utf-8 "/> <title> document.getElementSbyTagname ('li') ؛ لـ (var i = 0 ؛ i <ali.length ؛ i ++) {(function (i) {ali [i] .onclick = function () {Alert (i) ؛} ؛}) (i) ؛ }} ؛ </script> </head> <body> <ul> <li> 123 </li> <li> 456 </li> <li> 789 </li></ul> </body> </html>