Back to Question Center
0

وظائف جافا سكريبت التي تحدد وإعادة كتابة أنفسهم            وظائف جافا سكريبت التي تقوم بتعريف وإعادة كتابة أنفسهم المواضيع ذات الصلة: أبيسراكتولس & أمب؛ ليبراريسنبرو راو سيمالت

1 answers:
وظائف جافاسكريبت التي تحدد وإعادة كتابة أنفسهم

<إمغ سرك = "/ إمغ / 4bb606b439c705ec4101beaf4789f5e50. ينغ" ألت = "وظائف جافا سكريبت التي تحدد وإعادة كتابة أنفسهموظائف جافا سكريبت التي تقوم بتعريف وإعادة كتابة أنفسهم المواضيع ذات الصلة: أبيسراكتتولس & ليبراريسنبراو سيمالت "/>

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

الطبيعة الديناميكية لجافا سكريبت تعني أن الدالة ليست قادرة على استدعاء نفسها فقط، بل تعرف نفسها، وحتى إعادة تعريف نفسها - cat toy black white. ويتم ذلك بتخصيص دالة مجهولة الهوية لمتغير له نفس اسم الدالة .

سيمالت الوظيفة التالية:

     فونكتيون بارتي    {وحدة التحكم. سجل ('نجاح باهر هذا أمر مدهش!')؛بارتي = فونكتيون    {وحدة التحكم. سجل ('كان هناك، حصلت على تي شيرت')؛}}    

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

     فونكتيون بارتي    {وحدة التحكم. سجل ('كان هناك، حصلت على تي شيرت')؛}    

في كل مرة تسمى وظيفة بعد المرة الأولى، فإنه سيتم تسجيل رسالة "كان هناك، حصلت على تي شيرت":

     حزب   ؛<< 'نجاح باهر هذا أمر مدهش!'حفل  ؛<< 'كان هناك، حصلت على تي شيرت "حفل  ؛<< 'كان هناك، حصلت على تي شيرت "    

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

     فونكتيون بارتي    {وحدة التحكم. سجل ('نجاح باهر هذا أمر مدهش!')؛بارتي = فونكتيون    {وحدة التحكم. سجل ('كان هناك، حصلت على تي شيرت')؛}}كونست بيتشبارتي = الطرف؛ // لاحظ أن وظيفة الحزب لم يتم الاحتجاج بهاحفل شاطئي  ؛ // تم إعادة تعريف وظيفة الطرف    الآن، على الرغم من أنه لم يتم استدعاؤها صراحة<< 'نجاح باهر هذا أمر مدهش!'حفل  ؛<< 'كان هناك، حصلت على تي شيرت "حفل شاطئي  ؛ // ولكن لم يتم إعادة تعريف هذه الوظيفة<< 'نجاح باهر هذا أمر مدهش!'حفل شاطئي  ؛ // بغض النظر عن عدد المرات هذا ما يسمى أنها ستبقى هي نفسها<< 'نجاح باهر هذا أمر مدهش!'    

لوسينغ بروبيرتيز

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

     فونكتيون بارتي    {وحدة التحكم. سجل ('نجاح باهر هذا أمر مدهش!')؛بارتي = فونكتيون    {وحدة التحكم. سجل ('كان هناك، حصلت على تي شيرت')؛}}حفل. الموسيقى = 'الكلاسيكية الجاز'؛ // تعيين خاصية الدالةحفل  ؛<< "نجاح باهر هذا أمر مدهش!"حفل. موسيقى؛ // تم الآن إعادة تعريف الدالة، وبالتالي فإن الخاصية غير موجودة<< وندفيند     

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

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

     وظيفة ركوب    {إف (ويندو. ونيكورن) {ريد = فونكتيون    {// بعض التعليمات البرمجية التي تستخدم العلامة التجارية الجديدة وأساليب يونيكورن سباركليالعودة "ركوب على يونيكورن هو أفضل! '؛}} إلس {ريد = فونكتيون    {// بعض التعليمات البرمجية التي تستخدم أساليب المهر القديمةالعودة "ركوب على المهر لا تزال جيدة جدا.}}ريتورن ريد   ؛}    

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

     ركوب   ؛ // وظيفة إعادة كتابة نفسها، ثم يدعو نفسه<< 'ركوب على المهر لا تزال جيدة جدا'    

مرة واحدة تم استدعاء وظيفة، فإنه يعاد كتابة على أساس قدرات المتصفح. يمكننا التحقق من ذلك عن طريق فحص وظيفة دون استدعاء ذلك:

     ركوب<< فونكتيون ريد    {العودة "ركوب على المهر لا تزال جيدة جدا.}    

يمكن أن يكون هذا نموذجا مفيدا لتهيئة الوظائف في المرة الأولى التي يتم استدعاؤها، وتحسينها للمتصفح الذي يتم استخدامه.

وظائف العودية

A وظيفة التكرار هو واحد الذي يستدعي نفسه حتى يتم استيفاء شرط معين. انها أداة مفيدة لاستخدامها عندما تشارك العمليات التكرارية. والمثال الشائع هو الدالة التي تحسب عامل عدد:

     فونكتيون فاكتوريال (n) {إف (n === 0) {ريتورن 1؛} إلس {ريتورن n * فاكتوريال (n - 1)؛}}    

هذه الوظيفة ستعود 1 إذا تم توفير 0 كوسيطة (0 فاكتوريال هي 1)، وإلا فإنها ستضاعف الوسيطة نتيجة استدعاء نفسها بحجة واحد اقل. وستستمر الوظيفة في التذرع بها حتى تنتهي في النهاية الحجة 0 و 1 . وهذا يؤدي إلى مضاعفة 1، 2، 3 وجميع الأرقام حتى الوسيطة الأصلية.

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

  • إذا كان الرقم حتى، قسمه بمقدار اثنين

  • إذا كان الرقم غريبا، فاضربه بثلاثة وأضف واحد

على سبيل المثال، إذا بدأنا بالرقم 18، سيكون لدينا التسلسل التالي:

18 و 9 و 28 و 14 و 7 و 22 و 11 و 34 و 17 و 52 و 26 و 13 و 40 و 20 و 10 و 5 و 16 و 8 و 4 و 2 و 1 و 4 و 2 و 1 ، …

كما ترون، يصبح تسلسل عالقة في حلقة في النهاية، وركوب الدراجات من خلال "4،2،1". يقول كولاتز التخمين أن كل عدد صحيح إيجابي سيخلق تسلسل الذي ينتهي في هذه الحلقة. وقد تم التحقق من ذلك لجميع الأرقام تصل إلى 5 × 2⁶⁰، ولكن ليس هناك دليل على أنها سوف تستمر لتكون صحيحة لجميع الأعداد الصحيحة أعلى من هذا. طول} الخطوات. كان $ {سكنس} `؛}إف (n٪ 2 === 0) {n = n / 2؛} إلس {n = 3 * n + 1؛}ريتورن كولاتز (n، [. ، سكنس، n])؛}

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

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

سيمالت انظر ما يحدث لعدد 18:

     كولاتز (18)؛<< 'تسلسل أخذ 21 خطوة. كان 18،9،28،14،7،22،11،34،17،52،26،13،40،20،10،5،16،8،4،2،1 "    

كما ترون، فإنه يأخذ 21 خطوات، ولكن في نهاية المطاف فإنه ينتهي في 1.

لديك الذهاب في استخدام وظيفة ومعرفة ما إذا كان يمكنك العثور على قيمة فوق 5 × 2⁶⁰ التي لا تنتهي في 1 - عليك أن تكون مشهورا إذا كنت تفعل!

March 1, 2018