سؤال

هنا هو بلدي المعضلة.

لقد حصلت على هذا المقطع من التعليمات البرمجية:

var list_of_numbers = new Array();

function AddToArray(func)
{
    // Add to the *beginning* of the array
    // essentially reversing the order

    list_of_numbers.unshift(func);
}

function DisplayNumber(num)
{
    document.write(num);
}

for(var i=0;i<5;++i)
{
   AddToArray(function() { DisplayNumber(i); });
}

for(var i=0;i<5;++i)
{
   list_of_numbers[i]();
}​

ما يجب أن يحدث هو أن 5 وظائف مضمنة ستضاف إلى مجموعة كل أخذ نسخة من i.ولكن هذا لا يحدث.

المخرجات المتوقعة:

43210

الانتاج الفعلي:

01234

هل كانت مفيدة؟

المحلول

لديك اثنين من مسائل منفصلة ، كل ذات نطاق.

var list_of_numbers = new Array(); 
function AddToArray(func) 
{ 
    // Add to the *beginning* of the array
    // essentially reversing the order 
    list_of_numbers.unshift(func); 
} 

function DisplayNumber(num) 
{ 
    document.write(num); 
} 
for(var i=0;i<5;++i) 
{ 
    (function(i) 
     { 
         AddToArray(function(){ DisplayNumber(i); });
     })(i); 
} 

for(var j=0;j<5;++j) 
{ 
    list_of_numbers[j](); 
}​
  1. مجهول وظيفة كنت تمر على AddToArray لا بد أن المتغير i, وليس القيمة الحالية.لمعالجة هذا, نحن إنشاء وظيفة جديدة, و تمر في الفترة الحالية i.

  2. جافا سكريبت لديه وظيفة نطاق ، حتى عند إعادة تعلن i في الحلقة الثانية, كنت لا تزال تعديل نفس المتغير.وبالتالي ، فإننا تسميته إلى j.

إلا إذا كان الأول كانت قضية, سوف تحصل على 55555, حيث أن جميع الوظائف سوف تستخدم نفس i, في تلك النقطة 5.ولكن منذ إعادة استخدام i الثانية المؤشر ، i الحالي مؤشر حلقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top