سؤال

رأيت رمز JavaScript الذي يبدأ بـ with. هذا مربك بعض الشيء. ماذا يفعل وكيف يمكن استخدامه بشكل صحيح؟

with (sObj) return options[selectedIndex].value;
هل كانت مفيدة؟

المحلول

ويضيف إلى نطاق العبارات الواردة في الكتلة:

return sObj.options[selectedIndex].value;

يمكن أن تصبح:

with (sObj)
    return options[selectedIndex].value;

في حالتك ، لا تفعل الكثير ... ولكن النظر في ما يلي:

var a, x, y;
var r = 10;
a = Math.PI * r * r;
x = r * Math.cos(PI);
y = r * Math.sin(PI /2);

يصبح:

var a, x, y;
var r = 10;
with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

... ينقذ بضعة مفاتيح. تقوم وثائق Mozilla في الواقع بعمل جيد في شرح الأشياء بمزيد من التفاصيل (إلى جانب إيجابيات وسلبيات استخدامها):

مع - مركز مطور موزيلا

نصائح أخرى

ال with البيان هو سكر النحوي النقي ، ولكنه يمكن أن يسبب بعض الحشرات السيئة.

نرى مع بيان يعتبر ضارًا للتوضيح:

إذا لم تتمكن من قراءة برنامج وتكون واثقًا من أنك تعرف ما الذي ستفعله ، فلا يمكنك الثقة في أنه سيعمل بشكل صحيح. لهذا السبب ، with يجب تجنب البيان.

في ذلك مع Block ليس عليك الكتابة:

sObj.options[selectedIndex].value

ولكن يمكنك فقط استخدام:

options[selectedIndex].value

ما يعادل

return sObj.options[selectedIndex].value;

With يتيح لك إصدار كتلة من العبارات في سياق كائن معين. لذلك جميع العبارات في with تؤخذ الكتلة ليكون أعضاء في الكائن بين قوسين.

هذا يمكن أن يجعل الكود أكثر قابلية للقراءة في بعض الأحيان ، لكن يمكن أن يؤدي أيضًا إلى الغموض ، لأن المراجع المتغيرة يمكن أن تكون مع SOBJ أو Global.

الاستخدامات المشروعة لبيان "مع" JavaScript

أوصي بعدم استخدام هذا بسبب مشكلات الأداء ، ولكن ما يعنيه أعلاه هو:

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

مثالك يمكن إعادة كتابة ...

return sObj.options[selectedIndex].value;

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

مثال خيالي تمامًا ..

with (sObj) 
{
   if(options[selectedIndex].value < 10){
       options[selectedIndex].value++;
       total+ = options[selectedIndex].value;
   }
}

ولكن بعد قول ذلك ، غالبًا ما يمكن تحقيق توفير الكتابة بطرق أفضل.

إنها ليست وظيفة (كما هو موضح في عنوان السؤال قبل تحريرها) ولكن بيان. قد يكون من المنطقي أكثر إذا تم تنسيق عينة الكود مثل:

with (sObj){
    return options[selectedIndex].value;
}

فيما يتعلق بما يفعله (مصدر)

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

مما يعني أنه في عينة الكود ، يتم التحقق أولاً إذا options هي خاصية sObj. إذا كان ذلك بعد ذلك options يعود الى sObj.options, ، وإلا فإنه يتحقق من النطاقات الأخرى للمتغير المحدد بالاسم options

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

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