JavaScript أكثر عرضية مقارنة بلغات البرمجة الأخرى ، لذا فإن رمز JavaScript مليء بجميع أنواع أساليب الكتابة الغريبة. في بعض الأحيان يمكنك رؤية الزهور في الضباب. بطبيعة الحال ، فإن القدرة على فهم أنواع مختلفة من أساليب الكتابة هي أيضًا فهم متعمق لخصائص لغة JavaScript.
(function () {...}) () و (function () {...} ()) هي طريقتان شائعتان لتنفيذ وظائف على الفور في JavaScript. في البداية اعتقدت أنها كانت وظيفة مجهولة ملفوفة في قوس ، ثم أضفت قوسًا لاستدعاء الوظيفة. أخيرًا ، حققت الغرض من تنفيذها فور تعريف الوظيفة. في وقت لاحق ، وجدت أن سبب إضافة قوسين لم يكن كذلك. لفهم تنفيذ الوظائف على الفور ، تحتاج أولاً إلى فهم بعض المفاهيم الأساسية للوظائف.
إعلانات الوظيفة ، تعبيرات الوظائف ، وظائف مجهولة
إعلان الوظيفة: وظيفة fnname () {...} ؛ استخدم الكلمة الرئيسية للوظيفة لإعلان وظيفة ، ثم تحديد اسم وظيفة ، يسمى إعلان الوظيفة.
تعبير الوظيفة var fnname = function () {...} ؛ أعلن دالة باستخدام الكلمة الرئيسية للدالة ، ولكن لا تسمي الوظيفة. أخيرًا ، يتم تعيين وظيفة مجهولة المصدر متغيرًا ، يسمى تعبير الوظيفة ، وهو الشكل الأكثر شيوعًا في بناء جملة تعبير الوظيفة.
وظيفة مجهولة: function () {} ؛ استخدم الكلمة الرئيسية للوظيفة لإعلان وظيفة ، ولكن لم يتم تسمية الوظيفة ، لذلك يطلق عليها وظيفة مجهولة. وظائف مجهولة تنتمي إلى تعبيرات الوظائف. الوظائف المجهولة لها العديد من الوظائف. إذا قمت بتعيين متغير ، فأنت تقوم بإنشاء وظيفة ، وإذا قمت بتعيين حدث ، فستصبح معالجًا للحدث أو إنشاء إغلاق ، إلخ.
الفرق بين إعلان الوظيفة والتعبير عن الوظيفة هو أنه عند تحليل رمز JavaScript ، سيقوم محرك JavaScript "بترويج إعلان الوظيفة" (رفع إعلان الوظيفة) في بيئة التنفيذ الحالية (النطاق). يجب أن ينتظر تعبير الوظيفة حتى ينفذ محرك JavascirtP إلى خطه قبل تحليل تعبير الوظيفة من أعلى إلى الأسفل. 2. يمكن استدعاء تعبير الوظيفة على الفور مع قوسين بعد تعبير الوظيفة. لا يمكن إجراء إعلان الوظيفة ولا يمكن استدعاؤه إلا في شكل fnname (). فيما يلي مثالان على الاختلافات بين الاثنين.
fnname () ؛ function fnname () {...} // عادي ، لأن "الترويج" إعلان الوظيفة ، يمكن أن تكون مكالمات الوظائف fnname () ؛ var fnname = function () {...} // تم الإبلاغ var fnname = function () {Alert ('Hello World') ؛} () ؛ // تمت إضافة الطرود بعد تعبير الوظيفة. عندما يتوصل محرك JavaScript هنا ، يمكن استدعاء الوظيفة على الفور fnname () {Alert ('Hello World') ؛} () ؛ // لن يكون هناك خطأ ، ولكن لم يتم تسمية محرك JavaScript فقط عن إعلان الوظيفة ، ويتجاهل فقط الأقواس اللاحقة ، ولن يتم تسمية الوظيفة () } () ؛ // خطأ في بناء الجملة ، على الرغم من أن الوظائف المجهولة تنتمي إلى تعبيرات الوظائف ، لا يتم تنفيذ أي عملية تعيين ، // بحيث يعامل محرك JavaScript الكلمة الرئيسية للوظيفة في البداية كإعلان دالة ، ويبلغ عن خطأ: اسم وظيفة مطلوببعد فهم بعض مفاهيم الوظائف الأساسية ، نظرت إلى الوراء في طريقتي الكتابة (الدالة () {...}) () و (function () {...} ()) على الفور. في البداية ، اعتقدت أنها كانت وظيفة مجهولة ملفوفة في قوس وأضفت شريحة لاستدعاء الوظيفة على الفور. في ذلك الوقت ، لم أكن أعرف لماذا اضطررت إلى إضافة قوسين. أدركت لاحقًا أنه إذا اضطررت إلى إضافة قوسين بعد جسم الوظيفة ، يمكنني أن أسميها على الفور. ثم يجب أن تكون هذه الوظيفة تعبيرًا عن الوظيفة ، وليس إعلانًا عن الوظيفة.
(Function (a) {console.log (a) ؛ // firebug output 123 ، استخدم () عامل ()}) (123) ؛ (Function (a) {console.log (a) ؛ // firebug output 1234 ، asport the ()} (1234)) ؛ ! وظيفة (أ) {console.log (a) ؛ // Firebug Output 12345 ، استخدام! المشغل} (12345) ؛ +وظيفة (أ) {console.log (a) ؛ // Firebug Output 123456 ، استخدم + عامل التشغيل} (123456) ؛ -tunction (a) {console.log (a) ؛ // Firebug Output 1234567 ، استخدم - المشغل} (1234567) ؛ var fn = function (a) {console.log (a) ؛ // Firebug Output 12345678 ، استخدم = المشغل} (12345678)يمكنك رؤية نتيجة الإخراج وإضافتها قبل الوظيفة! و +و - وحتى الفواصل يمكن استخدامها للتنفيذ مباشرة بعد تعريف الوظيفة ، و () ،! يشبه المشغلون مثل +، -، = تحويل إعلانات الوظيفة إلى تعبيرات الوظائف ، مما يلغي الغموض بين تعبيرات وظائف محرك JavaScript وإعلانات الوظائف ، وإخبار محرك JavaScript بأن هذا تعبير دالة ، وليس إعلانًا عن الوظيفة ، يمكنك إضافة أقواس بعد ذلك وتنفيذ رمز الوظيفة على الفور.
إضافة قوسين هي الطريقة الأكثر أمانًا للقيام بذلك ، لأن! سوف يقوم المشغلون مثل +، و - أيضًا بإجراء عمليات ذات قيمة إرجاع الوظيفة ، والتي تسبب في بعض الأحيان مشكلة غير ضرورية.
ولكن ما فائدة الكتابة بهذه الطريقة؟
لا يوجد مفهوم للنطاق الخاص في جافا سكريبت. إذا أعلنت أن بعض المتغيرات في النطاق العالمي أو المحلي في مشروع تم تطويره من قبل العديد من الأشخاص ، فقد يتم الكتابة فوقه من قبل الآخرين بنفس الاسم. وفقًا لخصائص سلسلة نطاق وظائف JavaScript ، يمكن استخدام هذه التقنية لتقليد نطاق خاص واستخدام وظيفة مجهولة كـ "حاوية". يمكن أن تصل "الحاوية" إلى المتغيرات الخارجية ، في حين أن البيئة الخارجية لا يمكنها الوصول إلى المتغيرات داخل "الحاوية" ، وبالتالي فإن المتغيرات المحددة داخل (الوظيفة () {...}) () لن تتعارض مع المتغيرات الخارجية ، والمعروفة باسم "المجهول المجهول" أو "مساحة الاسم".
يستخدم jQuery هذه الطريقة. عندما يتم لف الرمز jQuery في (وظيفة (نافذة ، غير محددة) {... رمز jQuery ...} (نافذة) ، يمكنه حماية المتغيرات الداخلية لـ jQuery عند استدعاء رمز jQuery في النطاق العالمي.
هذه المقالة هي فهم وتجميع شخصي. إذا كانت هناك أي أخطاء ، فيرجى الإشارة إليها. تتم الإشارة إلى وجهات النظر في المقالة من:
"دليل موثوق لجافا سكريبت" و "البرمجة المتقدمة"