أي أمثلة على مثال غير تافهة ومفيد للكلمة الرئيسية "مع"؟

StackOverflow https://stackoverflow.com/questions/1675982

  •  16-09-2019
  •  | 
  •  

سؤال

ما زلت أجد with الكلمة الأساسية قليلا ...المبهمة.

موجز، with يتصرف مثل هذا:

with (obj) {
    // do stuff
}

هذا يضيف obj إلى رأس سلسلة النطاق ثم ينفذ الكتلة مع. عند الانتهاء من الكتلة، يزيل obj من رأس سلسلة النطاق.

بالنسبة الى MDC., ، هذا يسمح لك أن تفعل أشياء مثل

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

لذلك يمكنني مرجع خصائص Math -- مثل PI - مباشرة، دون أن يقول Math.PI. وبعد وهو ما يرام، ولكن نوع من عديمة الفائدة.

هل يمكن لأي شخص أن يقدم مثالا على استخدام مثير للاهتمام with?

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

المحلول

بديل لحل الإغلاق القياسي باستخدام وظائف داخل حلقة:

<a  href="#">blah</a><br>
<a  href="#">blah</a><br>
<a  href="#">foo</a><br>
<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
        for ( var i = anchors.length; i--; ) {
            var link = anchors[i];
            with ({ number: i }) {
                link.onclick = function() {
                    alert(number);
                };
            }
        }
    })();
</script>

ائتمان nlogax لتوفير الحل الذي تمزقه إلى حد كبير:جافا سكريبت قضية حلقة سيئة السمعة؟

إليك الحل القياسي:

<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
    for ( var i = anchors.length; i--; ) {
        var link = anchors[i];
        (function(i) {
            link.onclick = function() {
                alert(i)
            }
        })(i);
    }
    })();
</script>

نصائح أخرى

يجب أن يقال هنا أن with بيان في جافا سكريبت مهملا على نطاق واسع.

انظر دوغلاس كروكفورد مع بيان يعتبر ضارا.

لا أستطيع أن أقول ذلك أفضل مما كان عليه (بجدية، اتبع الرابط)، ولكن باختصار إذا قمت بذلك:

with (mySuperLongObjectReferenceThatIHateTyping) {
  propertyAlpha = 'a';
  propertyBeta = 2;
  propertyGamma = false;
}

لا يمكنك معرفة ذلك بالنظر إلى هذا الرمز إذا كنت تقوم بتعيين قيم لخصائص كائن MySuperLongObjjjjjjectRefferencethatetyphatetyping أو الكائن العمومي (نافذة).

يوصي كروكفورد هذا:

var o = mySuperLongObjectReferenceThatIHateTyping;
o.propertyAlpha = 'a';
o.propertyBeta = 2;
o.propertyGamma = false;

وهو أمر لا لبس فيه. أو يمكنك حتى استخدام وظيفة حتى يكون لديك نطاق ولا تنشئ متغير عالمي آخر:

(function(o) {
  o.propertyAlpha = 'a';
  o.propertyBeta = 2;
  o.propertyGamma = false;
})(mySuperLongObjectReferenceThatIHateTyping);

جون ريسج جافا سكريبت ميكرو يظهر بعض الاستخدام المثيرة للاهتمام مع.

أنا بانتظام استخدامها لإضافة خصائص CSS متعددة إلى style كائن، على سبيل المثال

with(document.body.style) {
    color = 'green';
    background = 'red';
}

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

إنه أيضا بديل للإغلاق عندما تريد أن تأخذ "لقطة" قيمة متغير:

var foo = [];
for(var i = 10; i--;)
    with({ i : i }) foo[i] = function() { document.writeln(i); };

// prints 0..9
for(var i = 0; i < foo.length; ++i)
    foo[i]();

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

كما هو الحال مع البيان في JS هو مثل بيان مع VB.NET. إنها ببساطة طريقة لتجنب التكرار مع خصائص / طرق كائن.

على سبيل المثال، تفترض أن عنصر تحكم تسمية يتم تعديله بناء على حدث / إجراء. يحتوي عنصر التحكم التسمية على خصائص مثل FontColor، CSSClass، الرؤية إلخ.

بدلا من كتابة مبرمج:

myLabel.FontColor=Color.Blue
myLabel.CSSClass="SomeCSSClass"
myLabel.Visiblity=True
myLabel.Text = "Hello World"

يمكننا تقصير ذلك إلى:

With myLabel
  .Text = "Hello World"
  .FontColor = Color.Blue
  .CssClass="SomeCSSClass"
  .Visibility=True
End With

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

لقد قمت بتجربة أسلوب تعريف الكائنات التي تشبه الطبقة التي تعتمد على جافا سكريبت مع بيان. أقدم أن هذا هو استخدام مشروع.

كل كائن يشبه الطبقة في هذه الوظائف النمط كصانع للكائنات لإرضاء بعض الأغراض.

هذا النمط لا يستخدم هذه الكلمة الرئيسية في الأساليب المثيل.

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

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

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

أعلن كائنا يشبه الفصل في البداية دون أي أساليب مثيل محددة فيه، وأضع كائن يشبه الفصل في أي مساحة اسم أنا برمجة.

ثم استدعاء كائن يشبه الفصل مرارا وتكرارا في طريقة تسمى "INIT" وفي كل مرة، اجتياز تهيئة, ، وظيفة يجب استدعاءها أثناء تهيئة مثيل.

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

في طريقتي، كل سمة عامة هي طريقة. جميع المتغيرات التي لن تكون قيمتها يجب أن تعيش على الجانب الخاص.

شيء واحد يمكن القيام به التهيئة هو إنشاء متغير على الجانب الخاص.

شيء آخر يمكن القيام به التهيئة هو إضافة طريقة إما على الجانب الجمهور أو الجانب الخاص.

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

الآن في بعض اللغات، وتحديدا لغة الروبي واللغة الذاتية، يمكنك كتابة معرف عاري ويفسر أنه تم تفسيره كطريقة استدعاء على الكائن الحالي. لذلك في Ruby، "Foo" يمكن أن تعني "Self.Foo" وفي الذات، "FOO" يمكن أن تعني "FOO FOO" (يختلف جودة استدعاء الأسلوب بين هذه اللغات، ولكن يصل إلى مستوى التفاصيل التي أتحدث بها من الدلالات الآن، "Self.Foo" في Ruby و "Foo" في الذات هي نفسها). هذا الاختصار خارج وجود "الذات" مريح بشكل خاص لاستدعاء الأساليب الخاصة ومتغيرات المثيل. لغة الجافا سكريبت لا توفر هذه الراحة.

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

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