سؤال

نعم ، نعم ، أنا أعلم ، الوضع الصارم ليس موجودًا بعد ، لكن في الحقيقة ، أخطط للمستقبل ...

لذا ، لماذا هذا:

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();

... غير مسموح به في الوضع الصارم ES5؟

أم أنا أسيء تفسير؟ JSLINT:

Problem at line 516 character 18: Strict violation.

هل يمكن أن يكون أكثر مطوّلة ، أتساءل ...؟

تعديل:

لتجنب الالتباس ، إليك المزيد من الكود الأصلي:

function displayLegend() {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
}
هل كانت مفيدة؟

المحلول

بعض المحاكمة والخطأ في هذا الرمز في JSlint

"use strict";
var that="dd";
function $(x){return x;}

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);

يظهر لي ما هو الخطأ: أنت تستخدم this كمعلمة. تغيير كليهما thises ل thatS لا يؤدي إلى الخطأ.

كما المواصفات يقول:

إذا هذه يتم تقييمه ضمن رمز الوضع الصارم ، ثم هذه لا يتم إكراه القيمة على كائن. أ هذه قيمة ال لا شيء أو غير معرف لا يتم تحويله إلى الكائن العالمي ولا يتم تحويل القيم البدائية إلى كائنات غلاف. ال هذه تم تمرير القيمة عبر مكالمة دالة (بما في ذلك المكالمات التي تم إجراؤها باستخدام function.prototype.apply و function.prototype.call) لا تكبر على هذه قيمة لكائن (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4). تركيزي

كما جون ريج يكتب,

أخيرًا ، تم حل خطأ طويل الأمد (ومزعج للغاية): الحالات التي يتم فيها إكراه أي خالية أو غير محددة على أن تصبح كائنًا عالميًا. يمنع الوضع الصارم الآن من الحدوث ويرمي استثناء بدلاً من ذلك.

(function(){ ... }).call( null ); // Exception

كما أوضحت ، فإن استخدام سطر الكود الخاص بك داخل إعلان الوظيفة يلقي خطأ في JSLINT ، في حين أن استخدامه داخل تعبير وظيفة لا. يبدو أن JSlint يخفف عن طريق الخاطئ لإعلان الوظيفة ، يرى this, ، لا يزال هذا غير محدد في تلك اللحظة ، ويلقي استثناء.

في هذه المرحلة ، أعتقد أنني يجب أن أقتبس Jurriy Zaytsev ('Kangax'):

هل هو مهم حقا؟

من الجيد أن نفهم ذلك الوضع الصارم ليس شرطا, ، ولكن هو مجرد خيار. هناك لتوفير قواعد أكثر صرامة لأولئك الذين يحتاجون إليها ، ويرغبون في التعامل مع (والاستمتاع) بعواقب.


تحديث: في النهاية وجدت تفسيرًا. إذا قرأت هذا الموضوع, ، خاصة من الرسالة رقم 1512 فصاعدًا ، ستقرأ ذلك

الهدف من ES5/صارمة هو حظر تسرب الكائن العالمي ، وهو أمر يقوم به ES3 بشكل غير منتظم. تقوم ES5/Strict ببعض أعمالها ديناميكيًا ، وبعض أعمالها بشكل ثابت. تقوم JSLINT بكل أعمالها بشكل ثابت ، لذلك يجب أن تكون أكثر تقييدًا من أجل مساعدتك على أفضل وجه في الحصول على برنامجك بشكل صحيح. دوغلاس كروكفورد في #1553

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

نصائح أخرى

بعد ما قاله ديفيد دوروارد ، وجدت شيئًا يجتاز اختبار JSLint. هذا غريب بصراحة عن سبب قيامه بذلك.

قبل: (انظر السؤال)

بعد، بعدما:

var displayLegend = function () {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
};

تعديل:

سألت دوغلاس كروكفورد:

يسمح JSLINT هذا فقط في الوضع الصارم في الوظائف التي من الواضح أنها تُعرف بأنها الطرق. لذا اكتب

object.property = function () {
    ... this ...
};

هذا يؤكد ما تقوله في المواصفات ، إلا أنه أكثر وضوحًا!

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