تحلل هذه المقالة طرق إنشاء ودعوة الوظائف المجهولة في JS. شاركه للرجوع إليه. طريقة التنفيذ المحددة هي كما يلي:
الوظائف المجهولة هي وظائف بدون أسماء ، تسمى أيضًا الإغلاق ، والتي تسمح بإنشاء وظيفة مؤقتة بدون اسم محدد. غالبًا ما يتم استخدامه كقيمة لمعلمات رد الاتصال ، لا يعرف العديد من المبتدئين وظائف مجهولة. دعنا نحلله هنا.
اسم الوظيفة اسم (قائمة المعلمة) {وظيفة الجسم ؛}
إذا كنت تقوم بإنشاء وظائف مجهولة ، فيجب أن تكون:
function () {function body ؛}
لأنها وظيفة مجهولة ، لا توجد عمومًا أي معلمات تم نقلها إليه.
لماذا تخلق وظائف مجهولة؟ تحت أي ظروف سيتم استخدام وظائف مجهولة؟ هناك سيناريوهان شائعان للوظائف المجهولة ، والآخر هو وظيفة رد الاتصال ، والآخر هو تنفيذ الوظيفة مباشرة.
تتطلب وظائف رد الاتصال ، مثل عمليات AJAX غير المتزامنة ، وظائف رد الاتصال. لن أشرح ذلك بالتفصيل هنا. فيما يتعلق بوظائف التنفيذ المباشر ، سأفهمها بعد النظر في مثال:
انسخ الرمز كما يلي: <script language = "javaScript">
var a = "a" ؛
(وظيفة(){
var a = "b" ؛
تنبيه (أ) ؛
}) () ؛
تنبيه (أ) ؛
</script>
في الكود أعلاه ، سيتم إخراج مربعين للتنبيه بالتسلسل. محتوى مربع التنبيه الأول هو B والثاني هو أ. هل رأيت أي فوائد؟ إلى اليمين ، يمكن أن يؤدي استخدام الوظيفة إلى الحد من نطاق المتغيرات بحيث يمكن أن تتعايش المتغيرات نفسها في البرامج النصية المختلفة.
أدناه ، دعونا أولاً نفهم المفاهيم المتعلقة بالوظائف المجهولة.
بيانات الوظيفة. لاستخدام وظيفة ، يجب علينا أولاً إعلان وجودها. الطريقة الأكثر شيوعًا التي نستخدمها هي تحديد وظيفة باستخدام عبارات الوظائف ، مثل:
انسخ الرمز كما يلي: الدالة ABC () {
// رمز للمعالجة
}
دالة ABC () {// رمز للمعالجة}
بالطبع ، يمكن أن تكون وظيفتك أيضًا مع معلمات أو حتى مع قيم الإرجاع.
نسخة التعليمات البرمجية كما يلي: عرض Plaincopy إلى ClistboardPrint؟
وظيفة ABC (x ، y) {
إرجاع x+y ؛
}
وظيفة ABC (x ، y) {return x+y ؛ }
ومع ذلك ، بغض النظر عن كيفية تحديد وظيفتك ، فإن مترجم JS سوف يترجمها إلى كائن وظيفة. على سبيل المثال ، يمكنك تحديد رقم وظيفة أحد الأمثلة المذكورة أعلاه وإدخال الكود التالي:
انسخ الرمز على النحو التالي: ALERT (typeof ABC) ؛ // "وظيفة"
سيظهر متصفحك مربعًا مطالبات ، مما يطالبك بأن ABC هو كائن وظيفة. إذن ما هو بالضبط كائن الوظيفة؟
كائن وظيفة
كائن الوظيفة هو كائن متأصل في JavaScript ، وجميع الوظائف هي في الواقع كائن وظيفة. دعونا أولاً نلقي نظرة على ما إذا كان كائن الوظيفة يمكنه استخدام المُنشئ مباشرة لإنشاء وظيفة جديدة؟ الجواب نعم. على سبيل المثال:
نسخة الكود كما يلي: var abc = new function ("x" ، "y" ، "return x*y ؛") ؛
تنبيه (ABC (2،3)) ؛ // "6"
أعتقد أن الجميع يجب أن يكون لديهم بعض الفهم لكيفية إعلان وظيفة الآن. إذن ما هي الوظيفة المجهولة؟
إعلان وظائف مجهولة
كما يوحي الاسم ، فإن الوظائف المجهولة هي وظائف بدون أسماء فعلية. على سبيل المثال ، نقوم بإزالة اسم الوظيفة في المثال أعلاه ثم نحدد ما إذا كانت وظيفة:
انسخ الرمز كما يلي: ALERT (typeof function () {}) ؛ // "function"
ALERT (typeof function (x ، y) {return x+y ؛}) ؛ // "function"
التنبيه (typeof وظيفة جديدة ("x" ، "y" ، "إرجاع x*y ؛")) // "وظيفة"
التنبيه (وظيفة typeof () {}) ؛ // "الدالة"
ALERT (typeof function (x ، y) {return x+y ؛}) ؛ // "function"
التنبيه (typeof وظيفة جديدة ("x" ، "y" ، "إرجاع x*y ؛")) // "وظيفة"
يمكننا بسهولة أن نرى أنها كلها كائنات وظيفية ، وبعبارة أخرى ، كلها وظائف ، لكن لديهم جميعًا خاصية واحدة - بدون أسماء. لذلك نسميهم "وظائف مجهولة". ومع ذلك ، على وجه التحديد لأنهم ليس لديهم "اسم" ، ليس لدينا طريقة للعثور عليهم. هذا يمتد مسألة كيفية استدعاء وظيفة مجهولة.
استدعاء وظيفة مجهولة
لاستدعاء وظيفة ، يجب أن يكون لدينا طريقة لتحديد موقعها والرجوع إليها. لذلك ، سنحتاج إلى العثور على اسم لذلك. على سبيل المثال:
انسخ الرمز كما يلي: var abc = function (x ، y) {
إرجاع x+y ؛
}
تنبيه (ABC (2،3)) ؛ // "5"
العملية أعلاه تعادل في الواقع تحديد وظيفة بطريقة مختلفة. هذا الاستخدام شيء نواجهه بشكل متكرر. على سبيل المثال ، عندما نقوم بإعداد وظيفة معالج أحداث DOM Element ، فإننا عادة لا نسميها ، ولكن بدلاً من ذلك نعطي حدثها المقابل إشارة إلى وظيفة مجهولة.
هناك بالفعل طريقة أخرى لاستدعاء وظائف مجهولة ، وهي جزء jQuery الذي نراه - استخدم () لإرفاق الوظائف المجهولة ، ثم إضافة زوج من الأقواس (بما في ذلك قوائم المعلمات). لنلقي نظرة على الأمثلة التالية:
انسخ الرمز كما يلي: ALERT ((الدالة (x ، y) {return x+y ؛}) (2،3)) ؛ // "5"
تنبيه ((وظيفة جديدة ("x" ، "y" ، "إرجاع x*y ؛")) (2،3)) ؛ // "6"
قد يتساءل الكثير من الناس لماذا يمكن استدعاء هذه الطريقة بنجاح؟ إذا كنت تعتقد أن هذا التطبيق غريب ، فيرجى التحقق من شرحي أدناه.
هل تعرف دور الأقواس؟ يمكن أن تقسم الأقواس تعبيراتنا إلى أجزاء ، وكل قطعة ، أي كل زوج من الأقواس ، لها قيمة إرجاع. قيمة الإرجاع هذه هي في الواقع قيمة إرجاع التعبير بين قوسين. لذلك ، عندما نرفق وظيفة مجهولة مع زوج من الأقواس ، تُرجع الأقواس كائن وظيفة من دالة مجهولة المصدر. لذلك ، فإن إضافة وظائف مجهولة إلى زوج الأقواس يشبه الوظيفة المسماة ونحصل على موضعها المرجعي. لذلك إذا قمت بإضافة قائمة معلمات بعد هذا المتغير المرجعي ، فسيتم تنفيذ نموذج استدعاء الوظيفة العادية.
لا أعرف ما إذا كان يمكنك فهم النص أعلاه. إذا كنت لا تزال لا تستطيع فهمها ، فيرجى إلقاء نظرة على الكود التالي وتجربته.
انسخ الرمز كما يلي: var abc = function (x ، y) {return x+y ؛} ؛ // تعيين كائن دالة مجهول إلى ABC
// مُنشئ ABC هو نفس مُنشئ الوظائف المجهولة. وهذا يعني أن تنفيذ وظيفتين هو نفسه.
ALERT ((ABC) .Constructor == (Function (x ، y) {return x+y ؛}). constructor) ؛
ملاحظة: يشير مُنشئ إلى وظيفة تنشئ كائنًا. وهذا هو ، هيئة الوظيفة التي يمثلها كائن الوظيفة.
باختصار ، فهمها (دالة مجهولة المصدر الموجودة في قوسين) ككائن دالة يتم إرجاعها بواسطة تعبير قوسين ، وبعد ذلك يمكنك إجراء استدعاء قائمة المعلمات العادية إلى كائن الوظيفة هذا. (لقد ارتكبت خطأً هنا من قبل. لا يمكن استدعاء تعبيرات الوظائف فقط مباشرة. قم بإزالة أقواس الوظائف المجهولة ويجب تعيينها بالتعبير. أي ، (الوظيفة () {Alert (1)}) () يجب أن تكون مكافئة لـ A = function () {ALERT (1)} () ، ولا يمكن إزالة A =.)
إنهاء
ما هو الإغلاق؟ تشير عمليات الإغلاق إلى كتل التعليمات البرمجية في لغة برمجة معينة تسمح بوجود وظيفة من المستوى الأول والمتغيرات المجانية المحددة في الوظيفة من المستوى الأول. حتى يتم إصدار وظيفة المستوى الأول ، يمكن تطبيق هذه المتغيرات الحرة التي لم تصدر خارج وظيفة المستوى الأول.
كيف؟ كان التعرق ... كان الأمر على ما يرام ، وكذلك فعلت (على الرغم من أنني أفهمها ، كانت مجرد مسألة قدرة التعبير). دعونا نشرح ذلك بطريقة أبسط: الإغلاق هو في الواقع ميزة لغة. إنه يشير إلى لغة البرمجة التي تتيح اعتبار الوظائف ككائنات ، ثم يمكن تحديد متغيرات مثيل (محلية) في وظائف مثل العمليات في الكائنات. يمكن حفظ هذه المتغيرات في الوظائف حتى يتم تدمير كائن مثيل الوظيفة. يمكن أن تحصل كتل التعليمات البرمجية الأخرى على قيم هذه المتغيرات المثيل (المحلي) بطريقة ما وتطبيقها على التطبيق.
لا أعرف ما إذا كان سيكون أكثر وضوحًا بعد شرح هذه الطريقة. إذا كنت لا تزال لا تفهم ، فلنبسيطه: تشير عمليات الإغلاق فعليًا إلى المتغيرات المحلية المحددة في وظائف التشغيل في لغة البرمجة.
الآن دعونا نلقي نظرة على مثال:
انسخ الرمز كما يلي: var abc = function (y) {
var x = y ؛ // هذا متغير محلي
وظيفة الإرجاع () {
التنبيه (x ++) ؛ // هذا هو المكان الذي يتم فيه استدعاء x في وظيفة المحلية من المستوى الأول في ميزة الإغلاق ويعمل عليها
التنبيه (y-) ؛ // متغير المعلمة المشار إليه هو أيضًا متغير مجاني
}} (5) ؛ // التهيئة
ABC () ؛ // "5" "5"
ABC () ؛ // "6" "4"
ABC () ؛ // "7" "3"
تنبيه (x) ؛ // خطأ! لم يتم تعريف "X"!
بعد رؤية هذا ، هل يمكنك معرفة ما إذا كان مقتطف الكود الخاص بـ jQuery هو الإغلاق؟
في رأيي ، دعنا نتحدث عن ذلك. ما إذا كانت ميزة الإغلاق قد تم تطبيقها ، فمن الضروري تحديد ما إذا كان العنصر الأكثر أهمية في هذا الرمز هو: المتغيرات المحلية غير المقيدة. ثم من الواضح أنه من المستحيل تطبيق ميزة الإغلاق دون أي تنفيذ. ولكن ماذا لو كان هناك تنفيذ في وظيفة مجهولة؟ كما يحتاج إلى تحديد ما إذا كانت هناك متغيرات محلية غير مقلوبة في تنفيذها. لذلك إذا سألت ما هي الميزات في JS المستخدمة في بداية مقتطفات رمز jQuery؟ ثم إنها مجرد دعوة إلى وظائف مجهولة ووظائف مجهولة. ومع ذلك ، فهو يعني خصائص الإغلاق ويمكن تنفيذها في أي وقت.
الاستخدام الأكثر شيوعا:
انسخ الرمز كما يلي: (function () {
تنبيه ("الماء") ؛
}) () ؛
بالطبع ، يمكن أيضًا تضمين المعلمات:
انسخ الرمز كما يلي: (الدالة (O) {
تنبيه (O) ؛
})('ماء')؛
هل تريد استخدام المكالمات بالسلاسل مع وظائف مجهولة؟ بسيط جدا:
انسخ الرمز كما يلي: (الدالة (O) {
تنبيه (O) ؛
إرجاع الحجج.
}) ('Water') ('Down') ؛
أنت تعرف جميع الوظائف المجهولة الشائعة ، دعنا نلقي نظرة على الوظائف غير المألوفة:
انسخ الرمز كما يلي: ~ (function () {
تنبيه ("الماء") ؛
}) () ؛ // الكتابة باردة بعض الشيء ~
وظيفة void () {
تنبيه ("الماء") ؛
} () ؛ // يقال أن الأكثر كفاءة ~
+وظيفة () {
تنبيه ("الماء") ؛
} () ؛
-وظيفة(){
تنبيه ("الماء") ؛
} () ؛
~ function () {
تنبيه ("الماء") ؛
} () ؛
!وظيفة(){
تنبيه ("الماء") ؛
} () ؛
(وظيفة(){
تنبيه ("الماء") ؛
} ()) ؛ // القليل من التنفيذ القسري ~
آمل أن تكون هذه المقالة مفيدة لبرمجة JavaScript للجميع.