دعونا نلقي نظرة على شرح المكالمة في MDN أولاً
تستدعي طريقة Call () وظيفة أو طريقة مع هذه القيمة المحددة والعديد من قيم المعلمة المحددة.
ملاحظة: تشبه وظيفة هذه الطريقة طريقة Apply () ، مع اختلاف واحد فقط ، وهي طريقة الاتصال () تقبل قائمة بالعديد من المعلمات ، بينما تقبل طريقة تطبيق () صفيف يحتوي على معلمات متعددة.
قواعد
fun.call (thisarg [، arg1 [، arg2 [، ...]]]]))
المعلمة
هذا
هذه القيمة المحددة عند تشغيل وظيفة المرح. تجدر الإشارة إلى أن هذه القيمة المحددة لا تعني بالضرورة هذه القيمة الحقيقية عند تنفيذ الوظيفة. إذا كانت هذه الوظيفة في الوضع غير الشجري ، فإن هذه القيمة المحددة على أنها فارغة وغير محددة ستشير تلقائيًا إلى الكائن العالمي (كائن النافذة في المتصفح) ، وستشير هذه القيمة بالقيمة الأصلية (الرقم ، السلسلة ، القيمة المنطقية) إلى كائن التغليف التلقائي للقيمة الأصلية.
Arg1 ، Arg2 ، ...
قائمة المعلمات المحددة.
لم يكن من السهل فهم الأمثلة على MDN في البداية. لقد نشرتها هنا. إذا كنت مهتمًا ، فيمكنك التحقق من Call-JavaScript بنفسك.
يتم تفسير Thisarg هنا على أنها هذه القيمة المحددة عند تشغيل المرح ، أي بعد استخدام المكالمة ، هذا في نقاط ممتعة إلى Thisarg؟ انظر إلى الكود
var p = "456" ؛ الدالة f1 () {this.p = "123" ؛ } الدالة f2 () {console.log (this.p) ؛ } f2 () ؛ // 456 f2.call (f1 ()) ؛ // 123 f2.apply (f1 ()) ؛ // 123الناتج الأول هو المتغير العالمي يسمى. في وقت لاحق ، نظرًا لاستخدام المكالمة والتطبيق ، فإن هذا في نقاط F2 إلى F1 ، بحيث يصبح الإخراج 123. في الواقع ، يستعير F1 طريقة F2 ويخرج P الخاص به
في هذا الوقت ، سيؤدي حذف هذا. P في F1 () إلى إخراج ثلاثة 456 ، مما يؤكد أنه عندما يكون هذا فارغًا أو غير محدد ، فإنه يشير فعليًا إلى المتغير العالمي.
بالنسبة إلى كائن التفاف الذي يشير إلى القيمة الأصلية ، نظرًا لأن كائنات التفاف التي أفهمها مؤقتة ، وفقط نوع القيمة الأصلية هو الإخراج أثناء الاختبار بدلاً من الكائن ، وكيفية إثبات ذلك هنا إذا كان أي شخص يعرف أنه يمكنه مناقشته معي إذا كنت تأمل أن تتم مناقشتها معي ، شكرًا لك!
نظرًا لأن المكالمة يمكنها تنفيذ كائن واحد لاستعارة كائن آخر ، هل يمكنه تنفيذ الميراث؟ انظر إلى الكود
الدالة f1 () {this.father = "الأب"} وظيفة f2 () {f1.call (this) ؛ this.child = "child" ؛ } var test = new F2 () ؛ console.log (test.father) ؛ //أبلا يوجد أب في الاختبار ، لأنه في F2 ()
f1.call (هذا) ؛
يشير هذا هنا إلى F2 ، أي F2 يستعير طريقة F1 ، والتي تدرك بالفعل الميراث.
دعنا نتحدث عن المعلمات هنا. يتم تمرير المعلمات هنا إلى المرح. دعونا نرى الرمز
الدالة f1 () {this.p = "123" ؛ } الدالة f2 (x) {console.log (this.p) ؛ console.log (x) ؛ } f2.call (f1 () ، 456) ؛ // 123 // 456ناتج 123 هو بسبب P في F1 ، وال 456 اللاحقة هو المعلمة التي تم تمريرها إلى F2 ، وهو أمر سهل الفهم.
انتبه بشكل أساسي للفرق بين المعلمات في الاتصال والتطبيق
يتم تمرير المكالمة في واحد تلو الآخر ، بينما يتم تطبيق صفيف تم تمريره في
الدالة f1 () {this.p = "test call" ؛ } الدالة f2 (x ، y ، z) {console.log (this.p) ؛ console.log (x) ؛ console.log (y) ؛ console.log (z) ؛ } الدالة f3 () {this.p = "اختبار تطبيق" ؛ } f2.call (f1 () ، 4،5،6) ؛ f2.call (f1 () ، [4،5،6]) ؛ f2.apply (f3 () ، [4،5،6]) ؛ f2.apply (f3 () ، 4،5،6) ؛يمكنك رؤية النتائج هنا
مكالمة الاختبار الأولى هي الإخراج الصحيح
يتم تمرير استدعاء الاختبار الثاني في صفيف ، لذلك يتم إخراج صفيف واحد أولا واثنان غير محددين
يطبق اختبار الفقرة الثالثة الإخراج الصحيح
أبلغت الفقرة الرابعة مباشرة عن خطأ بسبب الخطأ في تنسيق المعلمة
يجب أن يكون الفرق هنا واضحًا