لطالما كان نطاق JavaScript نقطة معرفة يصعب فهمها في التنمية الأمامية. تذكر بضع كلمات حول نطاق JavaScript. أنت لا تخاف من السفر حول العالم ...
1. "لا يوجد نطاق على مستوى الكتلة في جافا سكريبت"
يوجد نطاق على مستوى الكتلة في Java أو C#، أي أن الأقواس هي أيضًا نطاق.
public static void main () {if (1 == 1) {string name = "seven" ؛} system.out.println (name) ؛} // الإبلاغلا يوجد نطاق على مستوى الكتلة في JavaScript
الدالة الرئيسية () {if (1 == 1) {var name = 'Seven' ؛} console.log (name) ؛} // الإخراج: سبعة2. JavaScript يعتمد نطاق الوظيفة
في JavaScript ، تعمل كل وظيفة كنطاق ، ولا يمكن الوصول إلى المتغيرات في النطاق الداخلي خارجيًا.
الوظيفة الرئيسية () {var innervalue = 'seven' ؛} main () ؛ console.log (innervalue) ؛ // error: unitical reference referror: innervalue غير محدد3. سلسلة نطاق JavaScript
نظرًا لأن كل وظيفة في JavaScript هي نطاق ، إذا ظهرت وظيفة متداخلة ، ستظهر سلسلة نطاق.
XO = 'Alex' ؛ funct func () {var xo = "seven" ؛ function inner () {var xo = 'alvin' ؛ console.log (xo) ؛} inner () ؛} func () ؛على سبيل المثال ، يظهر الرمز أعلاه في سلسلة النطاق المكونة من ثلاثة نطاقات. إذا ظهرت سلسلة النطاق ، سيظهر الطلب عند البحث عن المتغيرات. للمثال أعلاه:
عند تنفيذ Console.log (XO) ، فإن ترتيب البحث الخاص به هو البحث من الداخل إلى الخارج وفقًا لأولوية سلسلة النطاق. إذا لم تكن الطبقة الداخلية غير موجودة ، فستبحث تدريجياً حتى لا يتم العثور على استثناء.
425762-20160707114743577-37359182.png
4. تم إنشاء سلسلة نطاق JavaScript قبل التنفيذ
تم إنشاء نطاق JavaScript قبل تنفيذه. عندما يتم تنفيذها في المستقبل ، تحتاج فقط إلى البحث وفقًا لسلسلة النطاق.
مثال 1:
XO = 'Alex' ؛ funct func () {var xo = "seven" ؛ function inner () {console.log (xo) ؛} إرجاع داخلي ؛} var ret = func () ؛ ret () ؛ // النتيجة:الكود أعلاه موجود بالفعل قبل أن تسمى الوظيفة:
النطاق العالمي -> نطاق وظيفة FUNC -> نطاق الوظائف الداخلية
عند تنفيذ [ret () ؛] ، لأنه يشير إلى الوظيفة الداخلية ، تم تعريف سلسلة النطاق لهذه الوظيفة على أنها: نطاق وظيفة Global -> نطاق وظيفة FUNC -> نطاق الوظيفة الداخلية ، لذلك عند تنفيذ [RET () ؛] ، سيتم العثور على المتغيرات بناءً على سلسلة النطاق الحالية.
مثال 2:
XO = 'Alex' ؛ function func () {var xo = "eirc" ؛ function inner () {console.log (xo) ؛} xo = 'seven' ؛ return inner ؛} 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" ؛ return bar ؛} var ret = func () ؛ ret ()في الكود أعلاه ، تم إنشاء سلاسل نطاقين قبل تنفيذ الوظيفة:
النطاق العالمي -> نطاق وظيفة البار
النطاق العالمي -> نطاق وظائف FUNC
عند تنفيذ [RET () ؛] ، يشير RET إلى وظيفة الشريط ، وسلسلة النطاق لوظيفة الشريط موجودة بالفعل: نطاق وظيفة النطاق العالمي -> عند التنفيذ ، سيتم البحث عنها استنادًا إلى سلسلة النطاق الحالية.
5. بيان مقدما
إذا لم تنشئ متغيرات واستخدمتها مباشرة في JavaScript ، فسيتم الإبلاغ عن خطأ:
console.log (xxoo) ؛ // error: uncaughter referenceerror: xxoo غير محدد
في JavaScript ، إذا تم إنشاء قيمة دون تعيين قيمة ، فإن القيمة غير محددة ، مثل:
var xxoo ؛ console.log (xxoo) ؛ // الإخراج: غير محدد
إذا تم كتابة هذا في الوظيفة:
الدالة foo () {console.log (xo) ؛ var xo = 'seven' ؛} foo () ؛ // الإخراج: غير محددالرمز أعلاه لا يبلغ عن خطأ ولكنه يخرج غير محدد. والسبب هو أنه قبل تنفيذ وظائف JavaScript ، سوف تعلن جميع المتغيرات فيها دون تعيين قيم. لذلك ، فإنه يعادل المثال أعلاه أن الوظيفة قد نفذت بالفعل var xo عندما "مسبقة" ؛ وبالتالي فإن إخراج الكود أعلاه غير محدد.
ما سبق هو ما قدمه لك المحرر لحل نطاق JavaScript (الكلاسيكي) في خمس جمل فقط. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!