Jshint: loopfunc & let / const

تم إنشاؤها على ١٥ فبراير ٢٠١٧  ·  7تعليقات  ·  مصدر: jshint/jshint

تنص بعض المشكلات (# 1301 و # 2225 ، وربما أخرى) على أنه تم حل هذه المشكلة ، ولكن لا يزال 2.9.4 يحذر من الوظيفة في الحلقات مع ما يلي:

const a = [], b = [];
for (let i in b) a.push(() => i);
for (let i of b) a.push(() => i);
for (let i = 0; i < 10; i++) a.push(() => i);

let i = 0;
while (i++ < 10) a.push(() => i);

التعليق الأكثر فائدة

سأستخدم طريقة وألّف وظيفتي "المسيئة" بتكوينات مضمنة ، وتشغيل وإيقاف تشغيل التسامح الحلقي حيث أعرف أن الكود الخاص بي سليم بشكل مرجعي.

بعد قولي هذا ، اعتقدت أنني سأقدم مثالاً آخر لإبراز مواضع وجود بعض الفجوات في هذه القاعدة:

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

الوظيفة المذكورة أعلاه لا تفعل أي شيء من أي فائدة. ولكن ، الأهم من ذلك ، لا تشير أي من القيم الموجودة في الحلقة إلى أي متغيرات خارج الحلقة. ومع ذلك ، فإن jshint يلقي التحذير:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

فقط اعتقدت أنني سأوقد النار بالإشارة إلى أن هذا التحذير قد يتم استدعاؤه في المواقف السليمة من الناحية المعجمية.

ال 7 كومينتر

شكرا على التقرير! على الرغم من التعليقات على القضايا التي أشرت إليها ، أنا
لا يمكن العثور على نسخة من JSHint حيث خففت هذا السلوك من أي وقت مضى بشكل صحيح.

أيضًا: المثال الأخير الذي شاركته هو حالة خاصة لا ينبغي أن تكون كذلك
مسموح:

let i = 0;
while (i++ < 10) a.push(() => i);

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

أيضًا: المثال الأخير الذي شاركته هو حالة خاصة لا يجب السماح بها:

أنت محق تماما ... يا للسخافة مني ... ^ __ ^
فيما يتعلق بالمسألة الحقيقية ، هل لدينا أي توقع لتنفيذ ذلك؟

ليس لدينا أي توقعات في الوقت الحالي. هل ترغب في المساعدة؟

فقط لأقول لأي شخص يواجه هذا: تظل هذه المشكلة في jshint 2.9.5.

رمز الخطأ الناتج هو W083.

overlookmotel - واجهت نفس المشكلة لأكثر من خمس سنوات.

توصيتي إما بوضع /*jshint loopfunc: true */ أعلى ملف .js أو إضافة "loopfunc" : true, إلى إعدادات .jshintrc . إنه لا يحل المشكلة حقًا ، ولكن إذا لم يتم حلها بعد مرور أكثر من 5 سنوات ، فهذا ليس شيئًا يمكن أو سيتم معالجته في أي وقت قريب.

سأستخدم طريقة وألّف وظيفتي "المسيئة" بتكوينات مضمنة ، وتشغيل وإيقاف تشغيل التسامح الحلقي حيث أعرف أن الكود الخاص بي سليم بشكل مرجعي.

بعد قولي هذا ، اعتقدت أنني سأقدم مثالاً آخر لإبراز مواضع وجود بعض الفجوات في هذه القاعدة:

function foo(myLoopArr)
{
    /* globals Promise: false */
    for(let val in myLoopArr)
    {
        const myPromArr = [];
        myPromArr.push(function() {
            return new Promise();
        });
    }
}

الوظيفة المذكورة أعلاه لا تفعل أي شيء من أي فائدة. ولكن ، الأهم من ذلك ، لا تشير أي من القيم الموجودة في الحلقة إلى أي متغيرات خارج الحلقة. ومع ذلك ، فإن jshint يلقي التحذير:

 myPromArr.push(function() {
                                ^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.

فقط اعتقدت أنني سأوقد النار بالإشارة إلى أن هذا التحذير قد يتم استدعاؤه في المواقف السليمة من الناحية المعجمية.

@ andrew-st-angelo-77media عمل جيد الإبلاغ عن ذلك. أنا فقط أتلقى نفس الخطأ بالضبط ، على الرغم من أن وظيفتي لا تشير إلى أي متغيرات خارجية محددة النطاق. آمل أن يتم الاعتناء بهذا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jugglinmike picture jugglinmike  ·  6تعليقات

Daniel-Hug picture Daniel-Hug  ·  3تعليقات

nzakas picture nzakas  ·  10تعليقات

MtDalPizzol picture MtDalPizzol  ·  7تعليقات

ghost picture ghost  ·  5تعليقات