مقدمة
اتصل وتطبيق كلاهما لتغيير السياق ، أي السياق ، عند تشغيل وظيفة. بمعنى آخر ، هو تغيير اتجاه هذا داخل جسم الوظيفة .
وظيفة الاتصال والتطبيق هي نفسها تمامًا ، لكن طريقة قبول المعلمات مختلفة.
تعريف الطريقة
يتقدم
يمكن أن تتلقى طريقة Function.apply(obj,args) معلمتين:
OBJ: سيحل هذا الكائن محل هذا الكائن في فئة الوظائف
args: هذا صفيف أو صفيف فئة. تمرر طريقة تطبيق العناصر في هذه المجموعة كمعلمات للدالة المدعو.
يتصل
المعلمة الأولى لطريقة الاتصال هي نفس طريقة التطبيق ، باستثناء أن المعلمة الثانية هي قائمة معلمات
في الوضع غير الشريطي ، عندما يتم تمرير المعلمة الأولى لدينا على أنها خالية أو غير محددة ، فإن هذا في جسم الوظيفة سيشير إلى كائن المضيف الافتراضي ، وفي المتصفح هو نافذة
var test = function () {console.log (this === window) ؛} test.apply (null) ؛ // truetest.call (غير محدد) ؛ // صحيحالاستخدام
كيف "اختطاف" الآخرين
في هذا الوقت ، سيتم الرجوع إلى طريقة LogName في FOO بواسطة Bar ، وهذا يشير إلى Bar
var foo = {name: "mingming" ، logName: function () {console.log (this.name) ؛ }} var bar = {name: "xiaowang"} ؛ foo.logname.call (bar) ؛ // xiaowangإدراك الميراث
وظيفة animal (name) {this.name = name ؛ this.showname = function () {console.log (this.name) ؛ }} function cat (name) {animal.call (this ، name) ؛ } var cat = new cat ("Black Cat") ؛ cat.showname () ؛ // الأسود القطفي التطوير الفعلي ، غالبًا ما يتم مواجهته عن غير قصد سيناريوهات تغيير عن غير قصد.
هناك طريقة ممتعة محلية. عندما يتم استدعاء المرح كدالة عادية ، فإن هذه المرح داخل النافذة إلى النافذة ، لكننا نريد غالبًا الإشارة إلى العقدة # ، راجع الكود التالي:
window.id = "window" ؛ document.queryselector ('#test'). onClick = function () {console.log (this.id) ؛ // test var fun = function () {console.log (this.id) ؛ } fun () ؛ // window}باستخدام المكالمة ، تطبيق يمكننا حل هذه المشكلة بسهولة
window.id = "window" ؛ document.queryselector ('#test'). onClick = function () {console.log (this.id) ؛ // test var fun = function () {console.log (this.id) ؛ } fun.call (هذا) ؛ // test}بالطبع يمكنك القيام بذلك ، ولكن في وضع eCmascript 5 الصارم ، تم تحديد هذا في هذه الحالة أنه لن يشير إلى الكائن العالمي ، ولكنه غير محدد:
window.id = "window" ؛ document.querySelector ('#test'). onClick = function () {var that = this ؛ console.log (this.id) ؛ // test var fun = function () {console.log (that.id) ؛ } fun () ؛ // test} دالة func () {"استخدام صارم" تنبيه (هذا) ؛ // الإخراج: غير محدد} func () ؛استخدامات أخرى
صفيف الفصل
هنا ، تسمى الكائنات التي تلبي الشروط التالية صفائف الفصل
1. لديك سمة الطول
2. تخزين البيانات وفقًا للفهرس
3. دفع ، البوب وغيرها من الطرق التي لا تحتوي على صفائف
وتشمل المصفوفات المشتركة من الفصول الحجج والعقار!
(function () {array.prototype.push.call (الوسائط ، 4) ؛ console.log (وسيطات) ؛ // [1 ، 2 ، 3 ، 4]}) (1،2،3)بهذه الطريقة ، ادفع 4 إلى الحجج
يمكن لـ Array.prototype.push Page تنفيذ مجموعة من المصفوفتين
لا توفر طريقة الدفع صفيفًا ، ولكنه يوفر Push (param1 ، param ، ... paramn) حتى تتمكن أيضًا من تثبيت المصفوفة واستبدالها عن طريق التطبيق ، أي:
var arr1 = صفيف جديد ("1" ، "2" ، "3") ؛ var arr2 = صفيف جديد ("4" ، "5" ، "6") ؛ Array.Prototype.push.apply (arr1 ، arr2) ؛ console.log (arr1) ؛ // ["1" ، "2" ، "3" ، "4" ، "5" ، "6"]يمكن أيضًا فهمه بهذه الطريقة ، يستدعي ARR1 طريقة الدفع ، ويتم استبدال المعلمات بتطبيق مجموعة الصفيف على مجموعة من قوائم المعلمات.
على سبيل المثال ، أريد أن أجد أقصى قيمة في صفيف الفصل
(function () {var maxnum = math.max.apply (null ، ensitions) ؛ console.log (maxnum) ؛ // 56}) (34،2،56) ؛نوع القاضي
console.log (object.prototype.toString.call (123)) // [رقم الكائن] console.log (object.prototype.toString.Call ('123')) // غير محدد] console.log (object.prototype.toString.call (true)) // صفيف] console.log (object.prototype.toString.call (function () {})) // [وظيفة الكائن]ما سبق هو المحتوى الكامل لملخص استخدام التطبيق والاتصال. الجميع مرحب بهم لترك رسالة للمشاركة في المناقشة. آمل أيضًا أن يكون هذا المقال مفيدًا للجميع في تعلم JavaScript.