النطاق هو دائمًا الأولوية القصوى في أي لغة برمجة لأنها تتحكم في دورة وضوح وحياة المتغيرات والمعلمات. عند الحديث عن هذا ، فهم أولاً مفهومين: نطاق مستوى الكتلة ونطاق الوظيفة.
ما هو نطاق مستوى الكتلة؟
ينتمي البيان المحدد في أي زوج من الأقواس المجعد ({و}) إلى كتلة ، وجميع المتغيرات المحددة في هذا غير مرئية خارج كتلة الكود ، والتي نسميها نطاق مستوى الكتلة.
من السهل فهم نطاق الوظيفة (*^__^*) ، والمعلمات والمتغيرات المحددة في الوظيفة غير مرئية خارج الوظيفة.
تحتوي معظم لغات الفئة C على نطاقات على مستوى الكتلة ، لكن JS لا. يرجى الاطلاع على العرض التوضيحي أدناه:
// c language#include <stdio.h> void main () {int i = 2 ؛ أنا--؛ if (i) {int j = 3 ؛ } printf ("٪ d/n" ، j) ؛ }عند تشغيل هذا الرمز ، سيظهر خطأ في "استخدام متغير غير محدد: J". كما ترون ، فإن لغة C لها نطاق على مستوى الكتلة لأن J محددة في كتلة البيان IF ، لذلك لا يمكن الوصول إليها خارج الكتلة.
وكيف يؤدي JS ، دعونا ننظر إلى عرض آخر:
اختبار functin () {for (var i = 0 ؛ i <3 ؛ i ++) {} ALERT (i) ؛ } امتحان()؛تشغيل هذا الرمز و "3" الملوثات العضوية الثابتة. يمكن ملاحظة أنه خارج الكتلة ، لا يزال المتغير الذي حددته في الكتلة يمكن الوصول إليه. أي أن JS لا يدعم النطاقات على مستوى الكتلة ، فهو يدعم فقط نطاقات الوظائف ، والمتغيرات المحددة في أي مكان في وظيفة ما هي مرئية في أي مكان في هذه الوظيفة.
فكيف نجعل JS لديه نطاق على مستوى الكتلة؟ هل ما زلت تتذكر أنه عندما يتم استدعاء المتغير المحدد في وظيفة ما ، سيتم تدمير المتغير؟ هل يمكننا استخدام هذه الميزة لمحاكاة نطاق مستوى الكتلة من JS؟ انظر إلى العرض التوضيحي التالي:
دالة اختبار () {(function () {for (var i = 0 ؛ i <4 ؛ i ++) {}}) () ؛ تنبيه (ط) ؛ } امتحان()؛قم بتشغيله مرة أخرى في هذا الوقت ، سيظهر خطأ غير محدد لـ "I". هاها ، تم تنفيذها ~~~ هنا ، نضع كتلة البيان في إغلاق ونطلق هذه الوظيفة. عند اكتمال استدعاء الوظيفة ، سيتم تدمير المتغير تلقائيًا ، لذلك لا يمكننا الوصول إليها خارج الكتلة.
ميزة الإغلاق من JS هي الميزة الأكثر أهمية ((*^__^*) يفهم الجميع). في JS ، من أجل منع تعارضات تسمية ، يجب أن نحاول تجنب استخدام المتغيرات العالمية والوظائف العالمية. لذا ، كيف تتجنب ذلك؟ حسنًا ، كما هو موضح في العرض التوضيحي أعلاه ، يمكننا وضع كل ما نريد تحديده إلى واحد
(function () {// content}) () ؛من بينها ، في هذا الوقت ، هل من المعادل إضافة نطاق وظيفة إلى طبقتهم الخارجية؟ لا يمكن للبرامج خارج هذا النطاق الوصول إليها.