عند النظر إلى الكود المصدري لقالب JavaScript ، وجدت أن هناك استخدامًا مثيرًا للاهتمام لإنشاء وظائف. أليس هذا metaprogramming؟
جافا سكريبت metaprogramming
نسخة الكود كما يلي:
يشير Metaprogramming إلى كتابة نوع معين من برنامج الكمبيوتر الذي يكتب أو يتلاعب برامج أخرى (أو نفسها) كبياناتها ، أو تكمل بعض العمل الذي كان ينبغي إكماله في وقت الترجمة في وقت التشغيل.
جافا سكريبت تقييم
نسخة الكود كما يلي:
تقوم دالة eval () بحساب سلسلة وتنفيذ رمز JavaScript فيه.
قد يكون هناك الاستخدام التالي:
نسخة الكود كما يلي:
eval ("x = 10 ؛ y = 20 ؛ document.write (x*y)")
بالطبع ، يستخدم هذا فقط لتنفيذ وظيفة معينة ، ولكن هذا المنتج أرخص وسهل ارتكاب أخطاء.
نسخة الكود كما يلي:
يجب تجنب وظيفة eval قدر الإمكان.
لذا فإن أفضل طريقة لاستخدام وظيفة جديدة ()
الفرق الكبير بين استخدام الوظيفة الجديدة () و eval () هو أن eval ليس مجرد وظيفة.
نسخة الكود كما يلي:
eval () يحسب السلسلة كتعبير javaScript ضمن نطاق التنفيذ الحالي ، مما يتيح الوصول إلى المتغيرات المحلية. دالة جديدة () تخفيضات JavaScript المخزنة في سلسلة تم تحويلها إلى كائن دالة ويمكن بعد ذلك استدعاؤها. نظرًا لأن الكود يعمل في نطاق منفصل ، لا يمكن الوصول إلى المتغيرات المحلية.
بمعنى آخر ، سوف تتداخل eval () مع نطاق الوظيفة الحالية. .
JavaScript وظيفة جديدة ()
ينشئ مُنشئ الوظيفة كائن وظيفة جديد. في JavaScript ، كل وظيفة هي في الواقع كائن دالة. يتم تحليل كائنات الوظائف التي يتم إنشاؤها باستخدام مُنشئ الوظيفة عند إنشاء الوظيفة. هذا أقل كفاءة من استخدام إعلانات الوظيفة والاتصال بها في الكود الخاص بك ، لأن الوظائف المعلنة باستخدام عبارات الوظائف يتم تحليلها ببيانات أخرى.
الوظيفة الجديدة () غير فعالة في المقارنة ، وهو ما يمكننا التنبؤ به في ظل الظروف الحالية.
مثال بسيط هو كما يلي:
نسخة الكود كما يلي:
var add = وظيفة جديدة (['x' ، 'y'] ، 'return x + y') ؛
دالة جديدة () توصيف السلسلة في وظيفة. . ثم يمكننا تنفيذها عن طريق التقديم
نسخة الكود كما يلي:
function.apply (null ، args)
وهذا ما رأيته في قالب JavaScript:
نسخة الكود كما يلي:
وظيفة جديدة (
tmpl.arg + '، tmpl' ،
"var _e = tmpl.encode" + tmpl.helper + "، _s = '" +
str.replace (tmpl.regexp ، tmpl.func) +
"'؛ العودة _s ؛"
) ؛
بالطبع لدينا طرق أخرى.