طريقة استدعاء الوظيفة
قبل الحديث عن الإخوة الثلاثة ، يطبقون ، اتصل وربط في JavaScript ، أود أن أتحدث عن أساليب الاتصال للوظائف:
• كدالة
• كطريقة
• كمؤسس
• استدعاء بشكل غير مباشر من خلال مكالماتهم () وتطبيق () طرق
نعلم جميعًا أساليب الاتصال الثلاثة السابقة وليست ضمن نطاق هذه المقالة ، لذلك لن نتحدث عنها.
لنتحدث عن طريقة الاتصال الرابعة
المكالمات غير المباشرة عبر الاتصال () وتطبيق ()
في الواقع ، يمكننا أن نعتبر هاتين الوظيفتين طرقًا لكائن معين ، والاتصال بشكل غير مباشر بالوظيفة عن طريق استدعاء الطريقة:
الدالة f () {} f.call (o) ؛ f.apply (o) ؛المعلمة الأولى من Call () و Apply () هي الكائن الأصل للاتصال بالوظيفة. إنه سياق الدعوة ، ويتم الحصول على إشارة إليه من خلال هذا داخل هيئة الوظيفة.
هل هم متماثلون ، أم أن هناك أي اختلافات ، وكذلك طريقة الربط؟ لا تقلق ، دعنا نحلل الاختلافات والاتصالات بين الثلاثة أدناه بالتفصيل.
يتصل()
تحدد طريقة CALL () هذا المؤشر المحدد (أحمق ، لا تزعجني بشأن صحته) والمعلمات بالطريقة التي تسميها. على سبيل المثال ، هناك وظيفة مثل هذه:
var fn = function (arg1 ، arg2) {console.log (this ، arg1 ، arg2) ؛ }سأسميها:
fn.call (null ، 'skylor' ، 'min') ؛ //1fn.call(undefined ، 'skylor' ، 'min') ؛ // 2var fx = function () {} fn.call (fx ، 'skylor' ، 'min') ؛ // 3ما هي قيم إرجاع طرق الاتصال الثلاثة هذه؟ لا هراء ، يرجى الاطلاع على:
1. NULL "Skylor" "Min" 2. غير محدد "Skylor" "Min" 3. FX "Skylor" "Min"
هل هذا هو الحال حقا؟ أنت ذكي ، انتقل إلى وحدة التحكم في المتصفح وجربها. سأذهب ، أنت غشاش ، هذا ليس مثل هذا:
Chrome1. نافذة "Skylor" "Min" 2. Window "Skylor" "Min" 3. FX "Skylor" "Min"
حسنًا ، أنت ذكي. ولكن هذا يوضح بالفعل طريقة المكالمة جيدًا. (النافذة متقدمة للغاية ، Microsoft يضحكون ...)
لاحظنا أن طريقة الاتصال ، المعلمة الأولى هي تحديد هذا المؤشر ، وكل معلمة بعد ذلك تحدد المعلمات المطلوبة. لاحظ أنني أستخدم "كل" ، مما يعني أنك بحاجة إلى عدة معلمات وتريد استدعاء الوظيفة ، وكتابة كل معلمة فيها واحدة تلو الأخرى.
يتقدم()
تطبيق () هو شقيق Call (). الأماكن الأخرى تبدو كما هي ، فهي جميع الرجال ، لكنها مختلفة في مكان واحد. دعونا نلقي نظرة على المثال أولاً:
fn.apply (null ، ['skylor' ، 'min']) ؛ //1fn.apply(fx ، ['skylor' ، 'min']) ؛ // 2
أخي ، هل كتبته خطأ؟ هناك المزيد من الأقواس. لا ، لا ، لا ، هذا ما يجعلها تبدو مختلفة عن المكالمة. المعلمة الثانية هي صفيف المعلمة المطلوبة.
ربط()
BIND () ، أليسوا ثلاثة أشقاء ، أفهم هذا ، Blabla ... لا ، لا ، إنه أخي أقسم أصبح الأخوة اليمين مع التقديم والاتصال ، وليس أخًا حقيقيًا.
بالطبع ، تتيح لك طريقة BIND أيضًا تحديد هذا المؤشر ، ولكن بدلاً من استدعاء وظيفة ، فإنها تُرجع وظيفة (أو نسخة) تسميها ، وتحدد هذا المؤشر والمعلمة المحددة إلى هذه الوظيفة. الاتفاقية ، الأمثلة توضح كل شيء:
var fnbound = fn.bind (null ، 'skylor' ، 'min') ؛
في هذا الوقت ، تعد Fnbound وظيفة ، وهي وظيفة أخرى مع هذه الإشارة إلى NULL والمعلمات هي ["Skylor" ، "Min"]. مُسَمًّى:
fnbound () ؛
نتيجة:
NULL ، "Skylor" ، "Min"
لا تقلق بشأن النافذة معي. . . . .
الفرق بين BIND والشقيقان الآخران هو أنه لا يطلق على وظيفة ، ولكنه يعيد وظيفة جديدة. وبالمثل ، فإنه يحدد أيضًا هذا المؤشر والمعلمة. طريقة تحديد المعلمات هي نفس المكالمة ، وتأتي واحدة تلو الأخرى.
دعونا نحصل على مثال أخير:
var ShoppingCart = (function () {var _calculatePrice = function () {return this.price * this.amount ؛} ؛ return {calculatePrice: _calculatePrice}}}) () ؛ var goods = {name: 'hammer' ، السعر: 199 ، المبلغ: 2} ؛ shorpingcart.calculateprice.call (geter) ؛هذا ينتهي. !
ما سبق هو المحتوى الكامل للتطبيق والاتصال والربط في JavaScript الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!