سؤال

هذا السؤال لديه بالفعل إجابة هنا:

خذ بعين الاعتبار كود جافا سكريبت التالي:

var a = [];

var f = function() {

    for (var i = 0; i < 3; i++) {
        a.push(function(){alert(i)});
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

تتم طباعة التنبيهات بالرقم "3" ثلاث مرات.أريد سلوكًا مختلفًا - في كل تكرار للحلقة، قم بإنشاء دالة تطبع القيمة الحالية لـ i.أي.3 وظائف تطبع مؤشرات مختلفة.

أيه أفكار؟

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

المحلول

قم بإنشاء وظيفة مجهولة تقبل i كمعلمة وإرجاع تلك الوظيفة المعينة:

for (var i = 0; i < 3; i++) {
    a.push((function(i) {
        return function() {
            alert(i);
        }
    })(i));
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

أو افعل شيئًا مشابهًا:إنشاء وظيفة مجهولة تقبل i كمعلمة لإضافة الوظيفة إلى المصفوفة:

for (var i = 0; i < 3; i++) {
    (function(i) {
        a.push(function() {
            alert(i);
        });
    })(i);
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

نصائح أخرى

مجرد نهج آخر، وذلك باستخدام الكاري:

var a = [];
var f = function() {
    for (var i = 0; i < 3; i++) {
        a.push((function(a){alert(a);}).curry(i));
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

// curry implementation
Function.prototype.curry = function() {
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function() {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments)));
  };
};

تحقق من تشغيل المقتطف أعلاه هنا.

var iterate = (function () {
    var i, j = [];
    for (i = 0; i < 3; i += 1) {
        j.push(i);
        alert(j[j.length - 1]);
    }
}());

لا تحتاج إلى الإغلاق لمجرد إخراج قيمة.ومع ذلك، ينبغي تضمين التعليمات البرمجية الخاصة بك في دالة للاحتواء الموجه للكائنات.لا يلزم استدعاء الوظائف ليتم تنفيذها.

يمكنك وضع نص حلقتك في وظيفة مجهولة:

var a = [];

for(var i = 0; i < 3; i++) (function(i) {
    a.push(function() { alert(i); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

من خلال إنشاء هذه الوظيفة وتمرير قيمة "i" للحلقة كوسيطة، فإننا نقوم بإنشاء متغير "i" جديد داخل نص الحلقة والذي يخفي بشكل أساسي "i" الخارجي.يرى الإغلاق الذي تدفعه على المصفوفة الآن المتغير الجديد، الذي يتم تعيين قيمته عند استدعاء الدالة الخارجية في الحلقة الأولى.قد يكون هذا أكثر وضوحًا إذا استخدمنا اسمًا مختلفًا عند إنشاء المتغير الجديد...هذا يفعل نفس الشيء:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

تم تعيين قيمة "iNew" بالقيمة 0، ثم 1، ثم 2 لأنه يتم استدعاء الدالة على الفور بواسطة الحلقة.

وظيفة (ط) {تنبيه (ط)

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