يشير الإغلاق إلى وظيفة لديها إذن للوصول إلى المتغيرات في نطاق وظيفة آخر ، ولكن يجب الانتباه إلى آلية تكوين النطاق ، أي أن الإغلاق يمكن أن يحصل فقط على القيمة الأخيرة التي تحتوي على أي متغيرات في الوظيفة.
كما في الحالات التالية:
وظيفة CREATE () {var arr = new array () ؛ لـ (var i = 0 ؛ i <10 ؛ i ++) {arr [i] = function () {return i ؛} ؛ } return arr ؛} var c_arr = create () ؛ for (var i = 0 ؛ i <c_arr.length ؛ i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />") ؛ }نتائج التنفيذ:
على السطح ، يبدو أن القيمة I التي تم إرجاعها بواسطة كل وظيفة مختلفة ، على سبيل المثال ، يجب أن تكون قيمة C_ARR [0] 0 ، ويجب أن تكون قيمة C_ARR [1] 1 ، وهكذا. يمكن الحصول على كل وظيفة عن طريق العودة 10. لماذا؟
نظرًا لأن سلسلة نطاق كل وظيفة تخزن الكائن النشط لوظيفة Create () ، فإنها تشير جميعًا إلى نفس المتغير i. بعد انتهاء الحلقة ، تصبح قيمة I 10. في هذا الوقت ، تشير كل وظيفة إلى نفس الكائن المتغير الذي يحمل المتغير i.
يمكننا فرض الإغلاق على التصرف كما هو متوقع من خلال إنشاء وظيفة مجال أخرى ، بحيث يتوافق كل موضع مع القيمة المقابلة.
وظيفة CREATE () {var arr = new array () ؛ لـ (var i = 0 ؛ i <10 ؛ i ++) {arr [i] = function (num) {return function () {return num ؛ }؛}(أنا)؛ } return arr ؛} var c_arr = create () ؛ for (var i = 0 ؛ i <c_arr.length ؛ i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />") ؛ }نتائج التنفيذ:
تحديد وظيفة مجهولة وتنفيذ الوظيفة المجهولة على الفور لتعيينها إلى الصفيف. هنا ، تحتوي الدالة المجهولة على معلمة NUM ، وهي القيمة التي سيتم إرجاعها بواسطة الوظيفة النهائية. عند استدعاء كل وظيفة ، نمر في المتغير i. نظرًا لأن معلمات الوظيفة يتم تمريرها بالقيمة ، فسيتم تعيين القيمة الحالية للمتغير لي إلى المعلمة NUM. داخل هذه الوظيفة المجهولة ، يتم إنشاء إغلاق الوصول وإعادته ، بحيث تحتوي كل وظيفة في صفيف ARR على نسخة من متغير NUM الخاص بها ، بحيث يمكنها إرجاع قيمها العددية المختلفة.
أمثلة كلاسيكية
دعونا نلقي نظرة على مثال كلاسيكي. لنفترض أن الصفحة تحتوي على مجموعة من علامات الأزرار. نستخدم البرامج النصية لربط حدث النقر بعلامات الأزرار هذه ، وعند النقر ، سوف يطفو على هذا العلامة.
<meta charset = "utf-8"/> <button> أولاً </button> <button> الثاني </button> <button> الثالث </button> <button> الرابع </button> <script type = "text/javaScript function () {Alert (i) ؛} ؛ } </script>انقر فوق كل زر للنتيجة
على السطح ، يبدو أن النقر على كل تسمية يجب أن يطفو على الظهور أرقامًا مختلفة
الأول يجب أن يطفو على السطح 0 ؛
الثاني يجب أن يطفو على السطح 1 ؛
وهلم جرا.
لكن النتيجة هي أن جميع الأزرار تظهر 4 ، والتي من الواضح أنها ليست النتيجة التي نريدها.
دعونا نغير البرنامج
<meta charset = "utf-8"/> <button> أولاً </button> <button> الثاني </button> <button> الثالث </button> <button> الرابع </button> <script type = "text/javaScript الدالة (num) {return function () {Alert (num) ؛}} (i) ؛ } </script>انقر على الثانية
انقر على الرابع
نحتاج فقط إلى إنشاء وظيفة مجهولة في الوظيفة ، وهي نفس الحالات المذكورة أعلاه. يمكن تنفيذ دالة مجهولة لالتقاط المتغير الخارجي I ، وتختلف قيمة I لكل زر.