أولاً ، دعونا نلقي نظرة على قطعة من الكود:
نسخة الكود كما يلي:
<a href = "javaScript: void (0) ؛"> 111 </a>
<a href = "javaScript: void (0) ؛"> 222 </a>
<a href = "javacsript: void (0) ؛"> 333 </a>
var a = document.getElementSbyTagName ("a") ؛
الوظيفة B () {
لـ (var i = 0 ؛ i <a.length ؛ i ++) {
a [i] .onclick = function () {
تنبيه (ط) ؛
}
}
}
وفقًا لنيتينا الأصلية للتصميم ، يجب أن يكون النقر على علامة A لإطفاء الرقم التسلسلي المقابل للعلامة ، أي ، انقر فوق الأول A إلى الظهور 0 ، والنقر على الثانية إلى الظهور 1 ... ولكن الحقيقة هي أن عدد العلامات التي تطفو عليها دائمًا هي عدد العلامات A دائمًا. ما هو السبب؟ هذه المشكلة قد أزعجتني لفترة طويلة. لقد استشرت العديد من المواد والكتب المرجعية عبر الإنترنت. معظمهم معقول. أعتقد أن العديد من الطلاب لا يعرفون الكثير عن الأسباب. سأتحدث عن فهمي لهذه القضية. إذا كان هناك أي عدم ملاءمة ، فيرجى انتقاد وتصحيح لي.
في فهمي الشخصي ، فإن السبب وراء فشل الوظيفة أعلاه في تحقيق الغرض من ذلك هو أن وظيفة معالجة الأحداث تربط المتغير I ، ويتم تعيين وظيفة معالجة الأحداث إلى onclick ، أي أن الوظيفة ستستدعي فقط عند النقر فوق العلامة. لذلك ، من الناحية المنطقية ، لا يتم تنفيذ الدالة () {Alert (i) ؛} في حلقة بسيطة ، وعندما نقر على العلامة A ، تم تنفيذ حلقة For بالفعل. في هذا الوقت ، فإن قيمة I هي القيمة النهائية لتنفيذ حلقة. لكي تكون بسيطًا ، فإن قيمة I Mesing to the Bunction ، وقيمة I نحتاجها هي القيمة التي تم تمريرها في وظيفة معالجة الأحداث في الوقت الفعلي. فهل هناك أي طريقة لتحقيق نية التصميم الأصلية لدينا؟ ربما يكون زميلًا ذكيًا قد خمنت استخدام الإغلاق.
دعونا نلقي نظرة على رمز آخر:
نسخة الكود كما يلي:
var a = document.getElementSbyTagName ("a") ؛
الوظيفة B () {
لـ (var i = 0 ؛ i <a.length ؛ i ++) {
a [i] .onclick = function (j) {
وظيفة الإرجاع () {
تنبيه (ي) ؛
}
}(أنا)؛
}
}
ب () ؛
قم بتنفيذ الكود أعلاه وستجد أنه تم تنفيذ الوظيفة التي نريدها ، أي النقر فوق أي علامة A يطفو على الظهور بالرقم التسلسلي حيث توجد العلامة. أعتقد أن العديد من الطلاب قد شاهدوا العديد من الإصدارات المماثلة من الكود أعلاه ، ولكن لماذا يمكننا تحقيق الوظائف التي نحتاجها من خلال القيام بذلك؟ هذا رأيي الشخصي. إذا كان هناك أي عدم ملاءمة ، فيرجى إعطائي بعض النصائح.
جوهر فهم الكود أعلاه هو فهم المتغير i. في هذا الرمز ، عند تنفيذ الوظيفة ويتم العثور على الحلقة ، يتم العثور على وظيفة مكالمة فورية. في هذا الوقت ، يتم تمرير القيمة المتغيرة في الوقت الفعلي إلى وظيفة المكالمات الفورية. يتم استدعاء الوظيفة على الفور وتخزن وظيفة معالجة الأحداث القيمة المتغيرة في الوقت الفعلي.
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون ذلك مفيدًا لفهم الجميع لإغلاق JS.