[javascript] هل هناك سبب جيد لتمرير سلسلة إلى setTimeout؟



Answers

بالنسبة لأولئك الذين يتم إعادة توجيههم هنا عن السؤال لماذا هو تمرير وظيفة أفضل من تمرير سلسلة .

1: تمرير سلسلة بإشعال مترجم

في كل مرة تضطر فيها إلى تقييم سلسلة ، تقوم بإطلاق مترجم كامل. لكل دعوة حيث تكون هناك حاجة إليها.

ليس هذا بطيئًا فحسب ، بل إنه يدمر كل تعقيدات JIT وعمل المتصفح التي تتم.

2: تمرير سلسلة أكثر حدودية.

نظرًا لأنه يتم تشغيل سلسلة من خلال المحول البرمجي ، فإنه ليس مرتبطًا تمامًا بالنطاق والمتغيرات المحلية.

في حين أنه غير ملحوظ في موقف مثل:

window.setInterval("doThing()");

في وضع أكثر تعقيدًا ، يكون الرمز أكثر نظافة:

window.setInterval("doThing(" + val1 + "," + val2 + ")");

ضد

window.setInterval(function() {
  // You can put a debugging point here
  dothing(val1, val2);
});

3: لا يمكن تمرير كائنات DOM عبر السلسلة

كما ذكر Álvaro ، لا يمكن تمرير كائنات DOM عبر طريقة سلسلة.

// There is no way to do this via a string.
var el = document.getElementById("my-element");
window.setInterval(function() {
  dothing(el);
});

(قد تكون أو لا تكون الأشياء الأخرى سالكة - اعتمادا على ما إذا كان يمكن إجراء تسلسلها ، ولكن بشكل عام سيكون من الصعب جدا.)

Question

نعلم جميعًا أن تمرير سلسلة إلى setTimeout (أو setInterval ) أمر شرير ، لأنه يتم تشغيله في النطاق العالمي ، ولديه مشكلات في الأداء ، ومن المحتمل أن يكون غير آمن إذا كنت تقوم بحقن أي معلمات ، وما إلى ذلك.

setTimeout('doSomething(someVar)', 10000);

لصالح هذا:

setTimeout(function() {
    doSomething(someVar);
}, 10000);

سؤالي هو: هل يمكن أن يكون هناك سبب للقيام بالأمر؟ هل هو الأفضل من أي وقت مضى ؟ إذا لم يكن كذلك ، فلماذا يسمح بذلك؟

السيناريو الوحيد الذي فكرت فيه هو الرغبة في استخدام دالة أو متغير موجود في النطاق العالمي ولكن تم تجاوزه في النطاق المحلي. هذا يبدو لي مثل تصميم رمز الفقراء ، ولكن ...






Related