ما تسبب في هذه المشكلة هو نتيجة تشغيل برنامج JS:
نسخة الكود كما يلي:
var i = 0 ؛
وظيفة A () {
لـ (i = 0 ؛ i <20 ؛ i ++) {
}
}
الوظيفة B () {
لـ (i = 0 ؛ i <3 ؛ i ++) {
أ () ؛
}
العودة أنا.
}
var result = b () ؛
نتيجة هذا البرنامج هو النتيجة = 21 ؛
من هذا البرنامج ، يمكننا أن نرى أنه لا توجد مشكلة في أن قيمة I هي 20 عند إرجاع الوظيفة.
عند إرجاع وظيفة B ، يجدر مناقشة ما إذا كانت قيمة I هي 20 أو 21.
جوهر المشكلة هو: أولاً تحديد ما إذا كنت يتم تنفيذ I <3 أو i ++ أولاً ، ثم حدد ما إذا كنت <3.
وفقًا لنتائج التنفيذ ، يمكن ملاحظة أنه تم تنفيذ i ++ أولاً.
نسخة الكود كما يلي:
وظيفة A () {
لـ (i = 0 ؛ i <20 ؛ i ++) {
// لا var i
// أنا هنا هو المتغير العالمي الذي يمكن للجميع الوصول إليه
}
}
الوظيفة B () {
لـ (i = 0 ؛ i <3 ؛ i ++) {
// ALERT (i) ؛ // بالمثل ، أنا هنا أيضًا متغير عالمي ، يعود 0 وبمجرد إرجاعه
a () ؛ // هذه الوظيفة إرجاع i = 20
// عندما I = 20 يمر i ++ و i = 21 ، فإنه لا يفي بظروف i <3 والخروج مباشرة. لذا عودة أنا = 21 هذا طبيعي!
}
العودة أنا.
}
var result = b () ؛
هنا نكممل ترتيب تنفيذ الحلقة:
الإجراء التالي مثال
نسخة الكود كما يلي:
لـ (int i = 0 ؛ i <10 ؛ i ++)
{
}
أول أداء i = 0 ؛ i <10 ؛ ثم قم بأداء الجولة الأولى من جسم الحلقة
ثم تنفيذ: i ++ ، i <10 ؛ ثم قم بتنفيذ الجولة الثانية من جسم الحلقة
حتى آخر i ++ بعد i> = 10 ، تنتهي الحلقة.
الآن
يتم تنفيذ البيان 1 قبل بدء حلقة (كتلة الكود)
يحدد البيان 2 شروط تشغيل حلقة (كتلة رمز)
يتم تنفيذ البيان 3 بعد تنفيذ الحلقة (كتلة الرمز)