الإغلاق في JavaScript هي حقا سؤال كليشيهات. في الآونة الأخيرة ، كنت أسأل عن مهارات التعبير الخاصة بي ولا يمكنني دعمها بالكامل. أنا مجنون. في طريق العودة ، فكرت فجأة في شيء بسيط للغاية. في الواقع ، عندما نقوم بمشاريع ، نستخدم غالبًا الإغلاق ، ولكن عندما نطرح الأسئلة ، غالبًا ما تكون الإجابات هي الإجابات التي نجدها غالبًا. للأسف ، سواء كنا نتعامل مع المقابلات أو نرغب حقًا في تعلم شيء ما ، سأشارككم فهمي ، والكتابة أمر لا مفر منه.
1. ما هو الإغلاق؟
يقول كتاب Red Bao: "إنه يشير إلى وظيفة لها الحق في الوصول إلى المتغيرات في نطاق وظيفة آخر."
ببساطة ، تسمح JavaScript باستخدام الوظائف الداخلية - أي تعريفات الوظائف وتعبيرات الوظائف موجودة في جسم وظيفة وظيفة أخرى. علاوة على ذلك ، يمكن لهذه الوظائف الداخلية الوصول إلى جميع المتغيرات المحلية والمعلمات والوظائف الداخلية الأخرى المعلنة في الوظيفة الخارجية حيث يقيمون. عندما يتم استدعاء إحدى هذه الوظائف الداخلية خارج الوظيفة الخارجية التي تحتوي عليها ، يتم تشكيل إغلاق. بعبارات بسيطة ، إنها "وظيفة تنشئ وظيفة أخرى في الداخل ، ويمكن للوظيفة الأخيرة قراءة المتغيرات في الوظيفة أعلاه ، ويمكن تسمية الوظيفة الأخيرة بأنها" إغلاق "".
2. ما هو استخدام الإغلاق؟
من خلال تقييمي المكثف ، إذا قلنا "باستخدام عمليات الإغلاق ، يمكننا القيام بالكثير من الأشياء. على سبيل المثال ، نقوم بمحاكاة نمط التعليمات البرمجية الموجهة للكائنات ؛ معبر عن الكود أكثر أناقة وإيجازًا ؛ وتحسين كفاءة تنفيذ الكود في بعض الجوانب" ، هل ستشعر بالفراغ؟ هل ستكون هذه أفضل؟ نظرًا لعدم وجود نطاق حقيقي على مستوى الكتلة في JavaScript ، ولكن من أجل إعلان بعض المتغيرات المحلية التي يمكن أن تستخدمها الوظيفة فقط ، سنستخدم عمليات الإغلاق ، حتى نتمكن من تقليل المتغيرات في النطاق العالمي وتنقية النطاق العالمي.
فيما يلي بعض الأمثلة:
1. وظيفة التنفيذ الذاتي المجهولة
نحن نعلم أنه إذا لم تتم إضافة جميع المتغيرات مع الكلمة الرئيسية VAR ، فسيتم إضافة الافتراضي إلى خصائص الكائن العالمي. هناك العديد من العيوب لإضافة مثل هذه المتغيرات المؤقتة إلى الكائن العالمي.
على سبيل المثال: قد تسيء الوظائف الأخرى استخدام هذه المتغيرات ؛ إن التسبب في أن يكون الكائن العالمي كبيرًا جدًا ويؤثر على سرعة الوصول (لأن قيمة المتغير يجب اجتيازها من سلسلة النموذج الأولي).
في كل مرة نستخدم فيها المتغير ، نستخدم الكلمة الرئيسية VAR. في المواقف الفعلية ، غالبًا ما نواجه موقفًا لا تحتاج فيه إلى تنفيذ بعض الوظائف إلا مرة واحدة ، ولا تحتاج متغيراتها الداخلية إلى الحفاظ عليها.
على سبيل المثال ، في تهيئة واجهة المستخدم ، يمكننا استخدام عمليات الإغلاق:
var data = {table: [] ، tree: {}} ؛ (الدالة (dm) {for (var i = 0 ؛ i <dm.table.rows ؛ i ++) {var row = dm.table.rows [i] ؛ for (var j = 0 ؛ j <row.cells ؛ i ++) {drawCell (i ، j) ؛}}}) (البيانات) ؛نقوم بإنشاء وظيفة مجهولة وتنفيذها على الفور. نظرًا لأن الخارجي لا يمكنه الإشارة إلى المتغيرات الموجودة بداخله ، فسيتم إصدار المورد فور تنفيذ الوظيفة. المفتاح ليس تلوث الكائن العالمي.
2. ذاكرة التخزين المؤقت نتيجة
سوف نواجه العديد من المواقف في التنمية. تخيل أن لدينا كائن وظيفة يستغرق وقتًا طويلاً يستغرق وقتًا طويلاً لمعالجة كل مكالمة. ثم نحتاج إلى تخزين القيمة المحسوبة. عند استدعاء هذه الوظيفة ، نبحث أولاً في ذاكرة التخزين المؤقت. إذا كان لا يمكن العثور عليها ، فسنقوم بإجراء الحسابات ، ثم نقوم بتحديث ذاكرة التخزين المؤقت وإرجاع القيمة. إذا تم العثور عليه ، يمكننا إعادة القيمة التي تم العثور عليها مباشرة. تقوم عمليات الإغلاق بالتحديد لأنها لا تحرر مراجع خارجية ، بحيث يمكن الحفاظ على القيم الموجودة داخل الوظيفة.
var cacheDsearchBox = (function () {var cache = {} ، count = [] ؛ return {attachSearchBox: function (dsid) {if (dsid in cache) {// إذا كانت النتيجة في ذاكرة التخزين المؤقت لذاكرة التخزين المؤقت [dsid] ؛ ذاكرة التخزين المؤقت [DSID] = FSB ؛ CacheDsearchBox.attachSearchBox ("الإدخال") ؛وبهذه الطريقة ، سوف نقرأ الكائن من ذاكرة التخزين المؤقت في المكالمة الثانية.
3. التغليف
var person = function () {// يكون نطاق المتغير داخل الوظيفة ، ولا يمكن الوصول إلى اسم var في الخارج. var name = "default" ؛ إرجاع {getName: function () {return name ؛ } ، setName: function (newName) {name = newName ؛ }}} () ؛ print (person.name) ؛ // Access مباشرة ، والنتيجة هي طباعة غير محددة (person.getName ()) ؛ person.setName ("abruzzi") ؛ print (person.getName ()) ؛4. تنفيذ الفصول والميراث
وظيفة person () {var name = "default" ؛ إرجاع {getName: function () {return name ؛ } ، setName: function (newName) {name = newName ؛ }}} ؛ var p = شخص جديد () ؛ P.SetName ("توم") ؛ ALERT (p.getName ()) ؛ var jack = function () {} ؛ // الموروثة من شخص jack.prototype = شخص جديد () ؛ // إضافة طريقة خاصة jack.prototype.say = function () {Alert ("Hello ، My Name is Jack") ؛ } ؛ var j = new Jack () ؛ J.SetName ("جاك") ؛ J.Say () ؛ ALERT (jetgetName ()) ؛في نهاية الكتابة ، لا أعرف أنه في النهاية ، وجدت جميعًا أنك قد استخدمت بالفعل الكثير من هذا في المشاريع التي قمت بها. على أي حال ، واجهت ذلك ، وهذه هي الطريقة التي توجد بها الإغلاق.
على الرغم من أنها كليشيهات ، إلا أنها لا تزال مهمة للغاية. أما بالنسبة لعيوب عمليات الإغلاق ، فحسب ما إذا كنت لا تسيء الإغلاق ، فسيؤدي ذلك إلى تسرب الذاكرة. ما هو تسرب الذاكرة على Baidu؟^_^.
التحليل الموجز أعلاه وتفسير الإغلاق في JavaScript (يجب القراءة) هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.