كيفية الوصول إلى هذا المتغير في مضمنة وظيفة ؟
-
30-09-2019 - |
سؤال
هنا هو بلدي المعضلة.
لقد حصلت على هذا المقطع من التعليمات البرمجية:
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]();
}
مجهول وظيفة كنت تمر على
AddToArray
لا بد أن المتغيرi
, وليس القيمة الحالية.لمعالجة هذا, نحن إنشاء وظيفة جديدة, و تمر في الفترة الحاليةi
.جافا سكريبت لديه وظيفة نطاق ، حتى عند إعادة تعلن
i
في الحلقة الثانية, كنت لا تزال تعديل نفس المتغير.وبالتالي ، فإننا تسميته إلىj
.
إلا إذا كان الأول كانت قضية, سوف تحصل على 55555, حيث أن جميع الوظائف سوف تستخدم نفس i
, في تلك النقطة 5.ولكن منذ إعادة استخدام i
الثانية المؤشر ، i
الحالي مؤشر حلقة.
لا تنتمي إلى StackOverflow