يتم تنفيذ كل بايت لبرنامج JavaScript في هذا السياق التنفيذ أو ذاك. يمكنك التفكير في هذه السياقات كجيران للرمز ، والتي يمكن أن تشير إلى كل سطر من الكود: من أين يأتي ، ومن هم أصدقاء وجيران. نعم ، هذه معلومات مهمة للغاية ، لأن جمعية JavaScript لديها قواعد صارمة للغاية تنص على من يمكنه التفاعل مع من. سياق التشغيل هو مجتمع به بوابات بدلاً من باب صغير مفتوح داخله.
يمكننا عادةً أن نشير إلى هذه الحدود الاجتماعية على أنها نطاقات ولديها أهمية كافية للتشريع في ميثاق كل جار ، وهي سلسلة نطاق السياق الذي نريد التحدث عنه. ضمن علاقة حي محددة ، يمكن للرمز الوصول فقط إلى متغيرات ضمن سلسلة النطاق الخاصة به. بالمقارنة مع المتغيرات التي تتجاوز حيها ، يفضل الكود التعامل مع المحلي (المحلي ، أي المحلي).
أي لغة برمجة لديها مفهوم النطاق. ببساطة ، النطاق هو النطاق الذي يمكن الوصول إليه للمتغيرات والوظائف ، أي النطاق يتحكم في رؤية وحيات الحياة للمتغيرات والوظائف. لطالما كان نطاق JavaScript نقطة معرفة يصعب فهمها في التنمية الأمامية. تذكر بضع كلمات لحل نطاق JavaScript بسهولة.
1. "لا يوجد نطاق على مستوى الكتلة في جافا سكريبت"
يوجد نطاق على مستوى الكتلة في Java أو C#، أي أن الأقواس هي أيضًا نطاق.
public static void main () {if (1 == 1) {string name = "Seven" ؛ } system.out.println (name) ؛} // الإبلاغ عن خطأ public static void main () {if (1 == 1) {string name = "Seven" ؛ } console.writeLine (name) ؛} // الإبلاغ عن خطألا يوجد نطاق على مستوى الكتلة في JavaScript
الدالة main () {if (1 == 1) {var name = 'Seven' ؛ } console.log (name) ؛} // الإخراج: سبعة2. JavaScript يعتمد نطاق الوظيفة
في JavaScript ، تعمل كل وظيفة كنطاق ، ولا يمكن الوصول إلى المتغيرات في النطاق الداخلي خارجيًا.
الدالة main () {var innervalue = 'seven' ؛} main () ؛ console.log (القيمة الداخلية) ؛ // خطأ: مرجع غير معروف: لا يتم تعريف القيمة الداخلية3. سلسلة نطاق JavaScript
نظرًا لأن كل وظيفة في JavaScript هي نطاق ، إذا ظهرت وظيفة متداخلة ، ستظهر سلسلة نطاق.
XO = 'Alex' ؛ دالة func () {var xo = "seven" ؛ دالة inner () {var xo = 'alvin' ؛ console.log (xo) ؛ } inner () ؛} func () ؛على سبيل المثال ، يظهر الرمز أعلاه في سلسلة النطاق المكونة من ثلاثة نطاقات. إذا ظهرت سلسلة النطاق ، سيظهر الطلب عند البحث عن المتغيرات. للمثال أعلاه:
عند تنفيذ Console.log (XO) ، فإن ترتيب البحث الخاص به هو البحث根据作用域链从内到外. إذا لم تكن الطبقة الداخلية غير موجودة ، فستبحث تدريجياً حتى لا يتم العثور على استثناء.
4. تم إنشاء سلسلة نطاق JavaScript قبل التنفيذ
تم إنشاء نطاق JavaScript قبل تنفيذه. عندما يتم تنفيذها في المستقبل ، تحتاج فقط إلى البحث وفقًا لسلسلة النطاق.
مثال 1:
XO = 'Alex' ؛ دالة func () {var xo = "seven" ؛ وظيفة inner () {console.log (xo) ؛ } الإرجاع الداخلي ؛} var ret = func () ؛ ret () ؛ // النتيجة النتيجة: سبعةالكود أعلاه موجود بالفعل قبل أن تسمى الوظيفة:
النطاق العالمي -> نطاق وظيفة FUNC -> نطاق الوظائف الداخلية
عند تنفيذ [ret () ؛] ، لأنه يشير إلى الوظيفة الداخلية ، تم تعريف سلسلة النطاق لهذه الوظيفة على أنها: نطاق وظيفة Global -> نطاق وظيفة FUNC -> نطاق الوظيفة الداخلية ، لذلك عند تنفيذ [RET () ؛] ، سيتم العثور على المتغيرات بناءً على سلسلة النطاق الحالية.
مثال 2:
XO = 'Alex' ؛ دالة func () {var xo = "eirc" ؛ وظيفة inner () {console.log (xo) ؛ } xo = 'Seven' ؛ إرجاع داخلي ؛} var ret = func () ؛ ret () ؛ // نتيجة الإخراج: سبعةالرمز أعلاه له نفس الغرض من المثال 1 ، ويؤكد أيضًا أن سلسلة النطاق موجودة بالفعل قبل أن تسمى الوظيفة:
النطاق العالمي -> نطاق وظيفة FUNC -> نطاق الوظائف الداخلية
بشكل مختلف ، عند تنفيذ [var ret = func () ؛] ، تمت إعادة ضبط قيمة متغير XO في نطاق func إلى "سبعة" من "eric" ، لذلك عند تنفيذ [ret () ؛] لاحقًا ، يمكنك العثور على "سبعة" فقط.
مثال 3:
Xo = 'Alex' ؛ function bar () {console.log (xo) ؛} func () {var xo = "seven" ؛ شريط الإرجاع ؛} var ret = func () ؛ ret () ؛ // نتيجة الإخراج: أليكسفي الكود أعلاه ، تم إنشاء سلاسل نطاقين قبل تنفيذ الوظيفة:
النطاق العالمي -> نطاق وظيفة البار
النطاق العالمي -> نطاق وظائف FUNC
عند تنفيذ [RET () ؛] ، يشير RET إلى وظيفة الشريط ، وسلسلة النطاق لوظيفة الشريط موجودة بالفعل: نطاق وظيفة النطاق العالمي -> عند التنفيذ ، سيتم البحث عنها استنادًا إلى سلسلة النطاق الحالية.
5. بيان مقدما
إذا لم تنشئ متغيرات واستخدمتها مباشرة في JavaScript ، فسيتم الإبلاغ عن خطأ:
console.log (xxoo) ؛ // error: uncaughter referenceerror: xxoo غير محدد
في JavaScript ، إذا تم إنشاء قيمة دون تعيين قيمة ، فإن القيمة غير محددة ، مثل:
var xxoo ؛ console.log (xxoo) ؛ // الإخراج: غير محدد في الدالة إذا تم كتابته مثل هذا: function foo () {console.log (xo) ؛ var xo = 'Seven' ؛} foo () ؛ // الإخراج: غير محددالرمز أعلاه لا يبلغ عن خطأ ولكنه يخرج غير محدد. والسبب هو أنه قبل تنفيذ وظائف JavaScript ، سوف تعلن جميع المتغيرات فيها دون تعيين قيم. لذلك ، فإنه يعادل المثال أعلاه أن الوظيفة قد نفذت بالفعل var xo عندما "مسبقة" ؛ وبالتالي فإن إخراج الكود أعلاه غير محدد.
JS هي لغة ممتعة للغاية. نظرًا لأن العديد من ميزاتها تهدف إلى تشغيل DOM في HTML ، فإنها تبدو غير رسمية وأقل صرامة قليلاً. ومع ذلك ، مع الرخاء المستمر وتطور الواجهة الأمامية وصعود العقدة ، لم يعد JS "لغة لعبة" أو "امتداد CSS" في عصر jQuery. من السهل أن يتم الخلط بين المبتدئين في هذه المقالة للمبتدئين ومطوري JS الذين مروا بتطوير الويب التقليدي. آمل أن يكون هذا المقال مفيدًا.