هناك طريقتان رئيسيتان لإنشاء وظائف في JavaScript: إعلانات الوظيفة وتعبيرات الوظائف. كلتا الطريقتين لها سيناريوهات مختلفة قابلة للتطبيق. تركز هذه الملاحظة بشكل أساسي على العديد من الخصائص الرئيسية لتعبيرات الوظائف وسيناريوهات استخدامها ، والتي تم وصفها أدناه.
الميزات الرئيسية
• اسم الوظيفة الاختيارية
اسم الوظيفة هو جزء ضروري من إعلان الوظيفة. اسم الوظيفة هذا يعادل متغير. سيتم نسخ الوظيفة المحددة حديثًا إلى هذا المتغير. يجب تنفيذ الدعوة إلى الوظيفة من خلال هذا المتغير في المستقبل. بالنسبة إلى تعبيرات الوظائف ، يكون اسم الوظيفة اختياريًا ، على سبيل المثال:
var sub = function (a1 ، a2) {return a1-a2 ؛ }في هذا المثال ، لا يحتوي تعبير الوظيفة على اسم وينتمي إلى تعبير وظيفة مجهول. دعونا نلقي نظرة على المثال التالي:
var sub = function f (a1 ، a2) {return a1-a2 ؛ } console.log (f (5،3)) ؛ // طريقة الاتصال غير الصحيحة Console.log (Sub (5،3)) ؛ // طريقة الاتصال الصحيحةفي هذا المثال ، اسم تعبير الوظيفة هو f. يصبح هذا الاسم F في الواقع متغيرًا محليًا داخل الوظيفة ويشير إلى كائن الوظيفة نفسه. إنه ذو فائدة كبيرة عندما يكون الوظيفة متكررة ، وسيتم مناقشته بالتفصيل لاحقًا.
• إنشاء أثناء مرحلة التنفيذ (يختلف عن إعلانات الوظيفة)
هذه الميزة هي أن تعبير الوظيفة يختلف بشكل واضح عن إعلان الوظيفة.
لا يعامل المترجم المترجم كلتا الطريقتين بالتساوي عند تحليل رمز JavaScript. سيقرأ المترجم المترجم أولاً إعلان الوظيفة ويجعله متاحًا قبل تنفيذ أي رمز ؛ أثناء تعبيرات الوظائف ، يجب أن تنتظر حتى يتم تنفيذ المترجم المترجم إلى سطر الكود حيث يوجد قبل أن يتم تحليله وتنفيذه بالفعل. على سبيل المثال:
console.log (إضافة (1،2)) ؛ // "3" console.log (sub (5،3)) ؛ // "معرف غير متوقع" ، وظيفة الخطأ إضافة (A1 ، A2) {return A1+A2 ؛ } var sub = function (a1 ، a2) {return a1-a2 ؛ }يمكن تنفيذ البيان الأول بشكل طبيعي. عند تقييم الكود ، يعلن محرك JavaScript عن الوظائف في الممر الأول ويضعها في الجزء العلوي من شجرة المصدر من خلال عملية تسمى ترويج إعلان الوظيفة. وهذا يعني ، خلال مرحلة إنشاء بيئة التنفيذ (تسمى الوظيفة ولكنها لم تبدأ التنفيذ) ، سيكون إعلان الوظيفة "استضافة". لذلك ، حتى إذا كان الرمز الذي يعلن وظيفة ما هو وراء الكود الذي يطلق عليه ، فإن محرك JavaScript سيرفع إعلان الوظيفة إلى الأعلى. ومع ذلك ، إذا تم تغيير إعلان الوظيفة إلى تعبير دالة ، فسيتم الإبلاغ عن خطأ أثناء التنفيذ. والسبب هو أنه قبل تنفيذ البيان الذي توجد فيه الوظيفة ، لا يحتوي المتغير الفرعي على إشارة إلى الوظيفة. وهذا يعني أنه سيتم تعيين المتغير الفرعي أثناء مرحلة تنفيذ التعليمات البرمجية. باستثناء الاختلافات المذكورة أعلاه ، في جوانب أخرى ، فإن بناء جملة إعلانات الوظيفة وتعبيرات الوظائف مكافئة.
• لا تؤثر على الكائنات المتغيرة
var sub = function f (a1 ، a2) {console.log (typeof f) ؛ // "وظيفة" إرجاع A1-A2 ؛ } console.log (typeof f) ؛ // "uniticed referenceerror: F غير محدد (...)"من المثال أعلاه ، يمكننا أن نرى أنه لا يمكن استخدام اسم الوظيفة F إلا داخل كائن الوظيفة ، وأن اسم وظيفة تعبير الوظيفة غير موجود في الكائن المتغير.
استخدم السيناريوهات
هناك العديد من سيناريوهات الاستخدام لتعبيرات الوظيفة. يصف ما يلي بشكل أساسي تطبيقات عودية الوظائف ومعدل الكود.
• تكرار الوظيفة
انظر المثال التالي:
Function Factorial (num) {if (num <= 1) {return 1 ؛ } آخر {return num * factorial (num - 1) ؛ }}هذه وظيفة فاعلة كلاسيكية ، ولكن هناك مشكلة واحدة في هذا المثال هي أن اسم الوظيفة للمجموعة مقترنة بشكل وثيق بجسم الوظيفة. إذا قمت بتنفيذ البيان التالي ، فستحصل على خطأ:
var otherfactorial = factorial ؛ العامل = فارغ ؛ console.log (otherfactorial (5)) ؛ // "Typeerror uncession: Factorial ليس وظيفة"
السبب في وجود خطأ هو أنه سيتم استدعاء الوظيفة العليا داخل جسم الوظيفة ، وتم إلغاء الإشارة إلى الوظيفة من قِبل العامل المتغير ، لذلك تم الإبلاغ عن خطأ. يمكن حل حل هذا الموقف عمومًا باستخدام الحجج. callee ، والتي تشير دائمًا إلى الوظيفة الحالية ، على سبيل المثال:
Function Factorial (num) {if (num <= 1) {return 1 ؛ } آخر {return num * ediuments.callee (num - 1) ؛ }}وبهذه الطريقة ، يمكنك الحصول على النتيجة الصحيحة من خلال تنفيذ وظيفة أخرى هنا. ومع ذلك ، في ظل الوضع الصارم "صارم" ، لا يمكن الوصول إلى الحجج. callee من خلال البرامج النصية. هذه هي كيفية حل هذه المشكلة باستخدام تعبيرات الوظائف ، على سبيل المثال:
var factorial = (function f (num) {if (num <= 1) {return 1 ؛} else {return num * f (num - 1) ؛}}) ؛ console.log (factorial (5)) ؛ // "120"• رمز وحدات
لا يوجد نطاق على مستوى الكتلة في JavaScript ، ولكن يمكننا استخدام تعبيرات الوظائف لتطوير رمز JavaScript. يمكن أن يتغلف الرمز المعياري من التفاصيل التي لا تحتاج إلى أن تكون معروفة للمستخدم ، وأن تعرضها فقط للواجهات ذات الصلة للمستخدم ، مع تجنب التلوث على البيئة العالمية ، مثل:
var person = (function () {var _name = "" ؛ return {getName: function () {return _name ؛} ، setName: function (newName) {_name = newName ؛}} ؛} ()) ؛ person.setName ("John") ؛ person.getName () ؛ //"جون"في هذا المثال ، يتم إنشاء تعبير دالة مجهول ، والذي يحتوي على المتغيرات والوظائف الخاصة للوحدة ؛ تُرجع نتيجة تنفيذ تعبير الوظيفة هذه كائنًا ، والذي يحتوي على الواجهة العامة المكشوفة بواسطة الوحدة النمطية للمستخدم. هناك العديد من الأشكال المحددة من وحدات التعليمات البرمجية. على سبيل المثال ، في بعض مكتبات JavaScript شائعة الاستخدام ، عادة ما تستخدم وظائف التنفيذ الفورية المشابهة للأمثلة التالية:
(function () {var _name = "" ؛ var root = this ؛ var person = {getName: function () {return _name ؛} ، setName: function (newName) {_name = newName ؛}} ؛ root.person = person ؛} .call (هذا)) ؛ person.setName ("John") ؛ person.getName () ؛ //"جون"تستخدم هذه الطريقة مباشرة الكائن الذي يحتوي على الواجهة العامة للوحدة النمطية كسمة للكائن العالمي ، بحيث يمكن استخدام سمة الكائن العالمي في مكان آخر.
تعبيرات دالة JavaScript أعلاه هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.