الكلمات السابقة
غالباً ما لا يعجبه التقييم ومع وجودها خطأ. في CSS ، يتم كره الجداول ولا تستخدم سوى الجداول لعرض البيانات على صفحات الويب ، بدلاً من التخطيط ، قد يتم رفضها على أنها غير منتظمة وتصحيح مفرط. إذن ما هو الوضع حول eval و with؟ ستقدم هذه المقالة وظيفة eval () وبيان بالتفصيل
تقييم
تعريف
eval () هي وظيفة عالمية. يستخدم JavaScript eval () لشرح سلسلة التشغيل المكونة من رمز مصدر JavaScript.
VAR RESORD = eval ('3+2') ؛ console.log (النتيجة ، النتيجة typeof) ؛ // 5 'الرقم'الاستخدام
eval () لديه معلمة واحدة فقط. إذا كانت المعلمة التي تم تمريرها ليست سلسلة ، فإنها تُرجع هذه المعلمة مباشرة. إذا كانت المعلمة عبارة عن سلسلة ، فسيقوم بتجميع السلسلة كرمز JavaScript. في حالة فشل التجميع ، يتم إلقاء استثناء خطأ في بناء الجملة (SyntaxerRor). إذا نجحت التجميع ، يتم تنفيذ الرمز وإعادة قيمة التعبير أو العبارة الأخيرة في السلسلة ، وإذا لم يكن للتعبير أو العبارة الأخيرة أي قيمة ، فسيعود في النهاية إلى غير محدد. إذا ألقت سلسلة استثناء ، فسيقوم الاستثناء بتمرير المكالمة إلى تقييم ()
var num = 1 ؛ var str = 'test' ؛ console.log (eval (num)) ؛ // 1console.log (eval (str)) ؛ // ReferenceerRor: لا يتم تعريف الاختبار var strlong1 = 'var x = 1 ؛ var y = 2 ؛' ؛ console.log (eval (strlong1) ، x ، y) ؛ x ++ ؛ '؛ console.log (eval (strlong2) ، x) ؛ // 1 2
نِطَاق
يستخدم Eval () بيئة النطاق المتغير التي تسميها. أي أنه يبحث عن قيمة المتغير ويحدد تشغيل متغير ووظيفة جديدة والرمز في النطاق المحلي.
var b = 2 ؛ funct foo (str ، a) {eval (str) ؛ console.log (a ، b) ؛} foo ('var b = 3 ؛' ، 1) ؛ // 1 3الاسم المستعار
عند استدعاؤه من خلال الاسم المستعار ، ستقوم Eval () بتنفيذ سلسلةها كرمز عالمي على المستوى الأعلى. قد يحدد التعليمات البرمجية التي تم تنفيذه المتغيرات العالمية الجديدة والوظائف العالمية ، أو تعيين قيم للمتغيرات العالمية ، ولكن لا يمكنها استخدام أو تعديل المتغيرات المحلية في الوظيفة.
var geval = eval ؛ var x = 'global' ، y = 'global' ؛ الدالة f () {var x = 'local' ؛ eval ('x += "change" ؛') ؛ return x ؛} function g () {var y = 'local' ؛ geval ('y += "change" ؛') ؛ return y ؛} console.log (f () ، x) ؛[ملاحظة] IE8-مكالمات المتصفح eval () من خلال الاسم المستعار والمكالمات eval () عادة نفس النتيجة.
أثر جانبي
يقوم مترجم JavaScript بإجراء الكثير من تحليل التعليمات البرمجية والتحسين. المشكلة في eval () هي أن الكود المستخدم للتنفيذ الديناميكي عادة لا يتم تحليله ، وبالتالي لا يمكن للمترجم التحسين تحسينه ، مما سيؤدي إلى تدهور الأداء
على غرار eval () هي setTimeOut () ، setInterval () ، وظيفة جديدة () ، إلخ. يمكن تنفيذ هذه الوظائف ديناميكيًا عند تشغيل البرنامج باستخدام سلاسل كمعلمات. لا يمكن لفوائد آلية التنفيذ هذه تعويض خسائر أداءها ، لذلك يجب أن تحاول تجنب استخدامها.
وضع صارم
لأن وظيفة eval () قوية للغاية ، فإن الوضع الصارم يقيدها بدقة
【1】 لا يمكن إنشاء المتغيرات أو الوظائف من خلال وظيفة eval () ، ولكن يمكن أن يتم الاستعلام عن قيمها وتغييرها
"استخدام صارم" ؛ eval ('var x = 1 ؛') ؛ console.log (x) ؛ // referenererror: x غير محدد 'use strict' ؛ var x = 1 ؛ eval ('x = 2 ؛') ؛ console.log (x) ؛ // 2【2】 غير قادر على استخدام Eval كمعرف
"استخدام صارم" ؛ var eval = 10 ؛ // syntaxerror: eval أو الوسيطات غير المتوقعة في الوضع الصارم
مع
الغرض من التعريف مع العبارات هو تبسيط عمل كتابة نفس الكائن عدة مرات.
يضيف البيان الكائن إلى رأس سلسلة النطاق ، ثم ينفذ البيان ، ويعيد أخيرًا سلسلة النطاق إلى حالتها الأصلية.
مع (كائن) {بيان ؛}تأثير
عندما يكون مستوى تعشيش الكائن عميقًا ، عادةً ما يتم استخدام العبارات لتبسيط كتابة التعليمات البرمجية. في جوهرها ، تتم معالجتها من خلال معالجة مرجع الكائن كنطاق واستخدام سمات الكائن كمعرفات في النطاق ، وبالتالي إنشاء نطاق معجمي جديد
في JavaScript العميل ، يمكن استخدام تعبير مثل ما يلي للوصول إلى العناصر في نموذج HTML
document.forms [0] .address.value
إذا ظهر مثل هذا التعبير عدة مرات في الكود ، فيمكنك استخدام العبارة مع إضافة كائن النموذج إلى المستوى العلوي من سلسلة النطاق
مع (document.forms [0]) {name.value = '' ؛ address.value = '' ؛ emai.value = '' ؛}هذه الطريقة تقلل الكثير من الإدخال دون الحاجة إلى بادئة المستند. يتم تركيب هذا الكائن مؤقتًا على سلسلة النطاق. عندما يحتاج JavaScript إلى تحليل معرفات مثل العنوان ، فسيبحث تلقائيًا في هذا الكائن.
[ملاحظة] يوفر العبارة مع اختصار لقراءة خصائص كائن ، ولكن لا يمكنها إنشاء خصائص لكائن
إذا كان للكائن O سمة X ، فإن الكود التالي يعين قيمة السمة إلى 1
var o = {x: 0} ؛ with (o) x = 1 ؛ console.log (ox) ؛ // 1إذا لم يتم تعريف السمة x في O ، فإن الكود التالي هو بالضبط نفس الرمز X = 1 الذي لا يستخدم العبارة مع. هذا لأنه يتم تنفيذ استعلام LHS على المتغير x و 1
var o = {} ؛ with (o) x = 1 ؛ console.log (ox) ؛ // undefinedConsole.log (x) ؛ // 1أثر جانبي
على غرار eval ، من الصعب للغاية تحسين رمز JavaScript للبيان مع ، كما أنه يسبب صعوبات في تصحيح الرمز. إنه أبطأ من الكود الذي لا يستخدم العبارة مع.
علاوة على ذلك ، إذا كان البيان غير مناسب ، فقد يتسبب ذلك في تسرب متغير وتلويث النطاق العالمي.
var x = 1 ؛ var o = {} ؛ with (o) {x = 2 ؛} console.log (x) ؛ // 2console.log (ox) ؛ // undefinedوضع صارم
في الوضع الصارم ، يحظر استخدام البيانات
// syntaxerror: قد لا يتضمن رمز الوضع الصارم A مع itse'use صارم '؛ var o = {} ؛ مع (o) {x = 2 ؛}في النهاية
إن استخدام Eval و with يجعل من المستحيل على المحرك تحسين عمليات البحث في نطاق النطاق في وقت الترجمة ، مما يؤدي إلى تدهور الأداء وتشغيل رمز أبطأ. نظرًا لأن Eval و With نادرًا ما تستخدم في العمل الفعلي ، فإن القيود المفروضة على الوضع الصارم لها تأثير ضئيل علينا. تمامًا مثلما أصدرت وزارة الخارجية إعلانًا في يوم من الأيام لن يصدر بلادنا تأشيرات إلى جامايكا. على الرغم من أننا سمعنا عن جامايكا ، إلا أن معظم الناس قد لا يذهبون إلى هناك مرة واحدة في حياتهم ، لذلك لا يهم. وبالمثل ، لا يهم إذا لم يكره التقييم أو لا
ما ورد أعلاه هو شرح مفصل لملخص تعلم JavaScript الذي قدمه لك المحرر حول وظيفة eval المحتقرة ومع أمثلة البيان. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!