تصف هذه المقالة تقنيات JavaScript Pre-Parsing والتقنيات ذات الصلة. شاركه للرجوع إليه ، على النحو التالي:
عامل
مرة أخرى ، ابدأ بمطالبات مقارنة الأخطاء لهذين المثال الصغير.
تنبيه (Y1) ؛ // رمز الجزء 1VAR y1 = 'dddd' ؛ Alert (y2) ؛ // رمز الجزء 2 // ALERT (typeof y2) ؛ y2 = 'xxxxx' ؛
دعنا نفكر أولاً في سبب قيام المرء بمطالبة غير محددة ، والآخر يرمي خطأ المتغيرات غير المحددة. . دعونا نلقي نظرة أولاً على عملية تحليل JavaScript.
قبل عملية التنفيذ ، ستقوم JavaScript بإجراء حدث "preparsement". يقوم محرك التحليل بإنشاء جميع متغيرات VAR على مستوى الكتلة ويمنحهم قيمة أولية: غير محددة. وبهذه الطريقة ، فإن السبب في أن المثال الأول يظهر غير محدد واضح.
لذا فإن الرمز الأول يعادل في الواقع
var y1 ؛ Alert (typeof y1) ؛ // بطبيعة الحال ، قيمتها غير محددة 1 = 'dddd' ؛
لماذا ألقى القطعة الثانية من الكود الخطأ مرة أخرى؟ لم يعد ينتمي إلى مرحلة "ما قبل الحجم" (هنا أفترض أن المتصفح لا يفعل سوى شيئين عند مواجهة علامة نصية: ما قبل العمل والتنفيذ ، وهو في الواقع ليس هذين الأمرين فقط). ومع ذلك ، في مرحلة التنفيذ ، سبب رمي الخطأ هو أن JS لا يعرف حالة Y2 في حالة قطاع التنفيذ (لم يتم التقاط أي معلومات عن y2 في مرحلة ما قبل الإصلاح) ، وبالطبع ، فإنه يلقي معلومات خطأ غير محددة. هناك مشكلة أخرى متورطة هنا: JS هي لغة ضعيفة من النوع ، ويمكن استخدام المتغيرات بدون تعريف ، فلماذا يتم إلقاؤها هنا كخطأ في التعريف؟
هناك دائمًا سبب لحدوث الأشياء. لدى JavaScript دائمًا العديد من الميزات الغريبة ، وهناك متغير يتم قراءته ويكتب غير متساوٍ. المتغيرات غير المحددة قابلة للكتابة فقط وغير قابلة للقراءة. ماذا يمكن كتابته؟ الجميع على دراية بهذه الطريقة الكتابة:
y2 = 'exam' ؛ // قبل ظهور عملية التعريف الخاصة بها (أي قبل عدم وجود نطاقها الخاص) ، ستنظر هذه العملية في هذا الرمز لتحديد متغير عالمي ، وتسجيل خاصية Y2 على النافذة ، وتعيينها للامتحان
ولكن عند قراءته ، لا يمكن لمحرك JS العثور على أي معلومات ذات صلة حول هذا الموضوع ، لذلك فهو يتصرف بمزاجه الخاص ويخطئ غير محدد دون تردد. هذه هي قاعدة لعبة JS. ومع ذلك ، لماذا يمكنك الحصول على نوعه؟ تذكر عمليات JS على الأشياء. إذا قمت بالوصول إلى كائن غير موجود ، فسيطلب منه غير محدد (لأنه حاليًا سمة لكائن النافذة).
ملاحظة: من الضروري التمييز هنا أن يتم استخدام المتغيرات غير المستوية والكتابة فقط للمتغيرات ، ويتم قراءة جميع خصائص الكائنات. هذه الميزة غير موجودة. إذا لم يكن موجودًا ، فسيطلب منه غير محدد.
ختاماً
في هذه المرحلة ، تنتج أفكاري: هناك بعض أوجه التشابه في عمليات كتابة المتغيرات والكائنات. ومع ذلك ، لكل منها مجموعة قواعدها الخاصة لعمليات القراءة. بسبب هذا ، تتم مواجهة المشكلات المذكورة أعلاه.
وبهذه الطريقة ، يجب الإجابة على السؤال التالي بسهولة.
if (! ('a' in window)) {var a = 1 ؛} Alert (a) ؛وظيفة
لتمديده ، وظيفة. تذكر ما قبل التمييز المذكور أعلاه. في التمييز المسبق لـ JavaScript ، بالإضافة إلى التعريف المسبق لمتغيرات VAR ، فإنه يتضمن أيضًا استخراج تعريف الوظيفة ، بحيث يمكن تعريف الوظيفة في أي مكان في البرنامج النصي والاتصال بها في أي مكان. لا يقتصر قبل ذلك.
ومع ذلك ، تتضمن طريقة تعريف الوظيفة طريقة تعريف حرفي ، باستخدام طريقة VAR لإعلان وظيفة. انظر أدناه
تنبيه (typeof y3) ؛ // النتيجة؟ var y3 = function () {console.log ('1') ؛ }تذكر هذه الاتفاقية: يجب أن تظهر المكالمة بعد الإعلان. لماذا؟ إذا فهمت ما سبق ، فإن الإجابة هنا واضحة بالفعل. عندما يكون VAR مسبقًا ، سيمنحهم محرك JavaScript قيمة أولية غير محددة. وبهذه الطريقة ، إذا أطلقنا عليها قبل إعلانها ، فإن محرك JavaScript لم يحصل بعد على قيمته الحقيقية ، فسيقوم بشكل طبيعي بالإبلاغ عن خطأ "XXX ليس دالة". يوضح هذا أيضًا سبب ارتباط إعلانات الوظيفة بترتيب الإعلانات والمكالمات ، والآخر ليس له مثل هذه القيود.
ختاماً
إنها وظيفة ، ونتيجة تنفيذ JS والتعديل الديناميكي ، ولا تزال تتبع قواعد التحليل قبل التحليل للمتغيرات (عند التنبيه أعلاه ، لم تحصل على معلومات الوظيفة الحرفية).
ماذا لو كان مزيجا من اثنين. انظر إلى ما يلي ، هناك كل من المتغيرات والوظائف لـ Y4.
تنبيه (typeof y4) ؛ // النتيجة؟ وظيفة y4 () {console.log ('y4')} var y4 ؛نظرًا لأن JavaScript لها أولوية عالية في الإرهاق المسبق ، فإن Y4 هو نوع الوظيفة بشكل طبيعي ، ولكن بعد تعيين Y4 (محرك JS في عملية التنفيذ) ، ستجاوز عملية المهمة الخاصة به JS إعلان الوظيفة. لذا:
التنبيه (typeof y5) ؛ var y5 = 'angle' ؛ function y5 () {console.log ('ghost') ؛ } تنبيه (y5) ؛نتيجة التنبيه الأولى هي الدالة لأنها تقع في الجزء العلوي من عملية تنفيذ JS. في المرة الثانية التي يتم فيها إعادة تسمية التنبيه ، تمت إعادة كتابة قيمته إلى 5 (لا تخلط بين موضع تعريف الوظيفة أدناه.)
بالتفكير في تحليل وتنفيذ JS ، أدركت أنني أدركت فجأة أن الإجابات على العديد من الأسئلة ظهرت بشكل طبيعي. كما قال مؤلف هذا المقال ، "بمجرد أن تفهم مفاهيم بيئة التنفيذ ، والكائنات ، والإغلاق ، والنطاق المعجمي ، وسلاسل النطاق ، يمكن حل العديد من الظواهر في لغة JS بسهولة."
إذا نظرنا إلى الوراء الآن ، حتى في هذه اللغة المذهلة ، هناك العديد من الأسباب التي يمكن إرجاعها إليها.
كيفية إصدار أحكام معلمة أفضل
بعد مناقشة الكثير أعلاه ، كيف يمكن أن يكون أقرب إلى التطوير الفعلي؟ منذ قراءة JavaScript واكتبها ، كيف يمكننا تجنب إصدار أحكام المعلمة دون الإبلاغ عن أخطاء؟
على سبيل المثال:
إذا كان (cusvar) {// الحكم هنا مشكلة ضمنية. }كيف تكون أكثر صرامة.
if (window ['cusvar']) {// تأكد من عدم الإبلاغ عن خطأ. // أو هذا الحكم هو أيضًا نافذة مجدية. cusvar | typeof cusvar! == 'undefined' // work}أخيرًا ، تتم إضافة اختبار صغير آخر ، (فهم فصل ما قبل التنفيذ والتنفيذ)
var y7 = 'test' ؛ function fun1 () {Alert (y7) ؛ var y7 = 'sex' ؛} fun1 () ؛لمزيد من المعلومات حول المحتوى المتعلق بـ javaScript ، يرجى مراجعة موضوعات هذا الموقع: "ملخص لتأثيرات وتقنيات تبديل JavaScript" ، "ملخص لمهارات خوارزمية بحث JavaScript" ، "ملخص لتأثيرات الرسوم المتحركة JavaScript و Techniques و" ملخص ". خوارزميات وتقنيات JavaScript Traversal "، و" ملخص استخدام العمليات الرياضية JavaScript "
آمل أن تكون هذه المقالة مفيدة لبرمجة JavaScript للجميع.