لقد كنت على اتصال مع JavaScript لفترة طويلة ، وفي كل مرة أفهم الإغلاق ، أبحث عن عمل على الواجهة الأمامية من الويب مؤخرًا ، لذلك أحتاج إلى توحيد الأساس.
تشير هذه المقالة إلى إغلاق مدونة Joy_lee استنادًا إلى مدونتها وتسعى جاهدة لشرح فهمي في شكل تعليقات. إذا كان هناك أي عدم ملاءمة ، نرحب بالنقد والتصحيح.
في البرمجة المتقدمة ، يقال: عندما يتم تعريف وظائف أخرى داخل وظيفة ، يتم إنشاء إغلاق. الإغلاق لديه إذن للوصول إلى جميع المتغيرات الموجودة في الوظيفة.
(كيف تفهم هذه الجملة؟ وفقًا لهذه الجملة ، فإن الإغلاق هو وظيفة متداخلة! يمكن للدالة المتداخلة بالطبع الوصول إلى متغيرات الوظيفة التي تحتوي عليها ، ولا توجد مشكلة.)
بشكل عام ، يمكن للوظائف الداخلية الوصول إلى المتغيرات على المستوى السابق أو حتى المستويات العالمية. لذلك يفهم بعض الناس هذا: من خلال الإغلاق ، يمكن تحقيق الوصول الخارجي إلى المتغيرات داخل الوظيفة المحلية.
(إذا قمنا ببساطة بتقسيم النطاق إلى مستوى واحد ، لنفترض أن النطاق العالمي هو المستوى الأول ، حيث يكون النطاق الداخلي لجسم الوظيفة المحدد هو المستوى الثاني ، وأن النطاق الداخلي للوظيفة المحددة هو متداخل في المستوى الثاني من المستوى الثاني ، ولا يمكن أن يصل المستوى الثاني إلى المستوى الثالث ، ولا يمكن أن يكون المستوى الثالث لا يمكنه الوصول إلى المستوى الثالث. يمكن العثور عليها في نطاق هذا المستوى ، ثم تم البحث في المستوى السابق حتى المستوى الأول. إجبار GC على إعادة تدوير هذه السلسلة.
الدالة A () {var i = 0 ؛ الدالة B () {Alert (++ i) ؛ } العودة ب ؛ } var c = a () ؛ ج () ؛وهذا يعني أن وظيفة الإغلاق هي أنه بعد تنفيذ A وإعادته ، يجعل الإغلاق آلية جمع القمامة JavaScript GC لا تسترد الموارد التي تحتلها A ، لأن تنفيذ وظيفة داخلية B من يحتاج إلى الاعتماد على المتغيرات في A.
نظرًا لوجود الإغلاق ، بعد الوظيفة ، أعود ، أنا موجود دائمًا. وبهذه الطريقة ، في كل مرة يتم تنفيذ C () ، فإنني من قيمة أنا نبهت بعد إضافة 1.
ثم ، إذا لم ترد A الوظيفة B ، فإن الموقف مختلف تمامًا. لأنه بعد تنفيذ A ، لا يتم إرجاع B إلى العالم الخارجي لـ A ، ولكن يتم الإشارة إليه فقط من قبل A ، وفي هذا الوقت سوف تتم الإشارة إلى A فقط من قبل B ، لذلك يتم الرجوع إلى بعضهما البعض من قبل بعضهما البعض ولكن لا يتم إزعاجها من قبل العالم الخارجي (المشار إليها من قبل العالم الخارجي) ، يتم إعادة تدوير الوظائف A و B بواسطة GC.
في الواقع ، هذا هو الإغلاق الذي يمتد دورة حياة المتغير. عادةً ما يتم تدمير نطاق الوظيفة ، أي المتغيرات ، بعد تنفيذ الوظيفة ، ولكن عندما تُرجع الوظيفة إغلاقًا ، طالما لم يتم إطلاق الإغلاق ، فإن سلسلة النطاق بأكملها ستحتل الذاكرة. (تمديد عمليات الإغلاق دورة حياة المتغير ، والتي تشير إلى حالة الرجوع إليها في المستوى الأول. ولكن بدون هذه المرجع ، لا يزال بإمكان الإغلاق أن يسمى الإغلاق؟)
الحديث عن سلسلة النطاق: أي نطاق الوظيفة الخاص ، ونطاق الوظيفة للطبقة السابقة ... والنطاق العالمي. عند الوصول إلى متغير ، إذا لم يكن لديك ذلك ، فابحث عن الطبقة حسب الطبقة حتى العالم بأسره. إذا لم يكن لديك ذلك بعد ، فستبلغ عن خطأ.
(أريد حقًا أن أشكو من أن سلسلة نطاق الإغلاق منحنية.)
ملاحظة: أوصى بعض مستخدمي الإنترنت مقالًا آخر لتحليل مفهوم إغلاق JavaScript . هل هو موثوق؟ أخيرًا ، هناك مفهوم واضح:
بعد قوله كثيرًا ، ما هو بالضبط الإغلاق؟ دعنا نلخصه أدناه:
الإغلاق هو مفهوم يصف ظاهرة تكمن فيها الذاكرة بعد تنفيذ الوظيفة. طالما أنك تفهم هذا المفهوم الأساسي ، ليس من الصعب فهم عمليات الإغلاق.
تتيح لك المقالة أعلاه فهم عمليات الإغلاق في جملة واحدة (بسيطة وسهلة الفهم) هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.