Function.prototype.call()‎

من موسوعة حسوب

الدالة Function.prototype.call()‎ تستدعي دالةً وتضبط قيمة this فيها إلى القيمة المعطية، وستُوفَّر الوسائط التي ستُمرَّر إليها كقائمة.

ملاحظة: صحيحٌ أنَّ البنية العامة لهذه الدالة تكاد تماثل بينة الدالة apply()‎، لكن الفرق الرئيسي بينهما هو أنَّ الدالة apply()‎ تقبل مصفوفةً واحدةً تحتوي على الوسائط، بينما call()‎ تقبل قائمةً بالوسائط التي تُمرَّر إلى الدالة.

البنية العامة

function.call([thisArg, arg1, arg2, ...])

thisArg

وسيطٌ اختياري، وهو يُمثِّل قيمة المعامل this التي ستُستعمل في الدالة function، لاحظ أنَّ قيمة this المُمرَّرة لا تعني بالضرورة أنَّها القيمة التي ستستخدمها الدالة؛ فلو لم يكن تنفيذ الدالة في نمط strict، فسيُستعاض عن القيمتين null و undefined بالكائن العام (global object)، وستُغلَّف القيم الأوليّة بكائنات.

arg1, arg2, ...‎

الوسائط الاختيارية التي ستُمرَّر إلى المصفوفة.

القيمة المعادة

القيمة المعادة نتيجة استدعاء الدالة المُحدَّدة مع قيمة this والوسائط (إن وُجِدَت).

الوصف

يمكنك إسناد قيمة this مختلفة عند استدعاء دالة موجودة مسبقًا؛ إذ يُشير المعامل this إلى الكائن الحالي؛ أما عند استخدام call، فيمكننا كتابة دالة مرةً واحدةً ثم استدعاؤها في كائنٍ آخر، دون الحاجة إلى إعادة كتابة تلك الدالة في الكائن الجديد.

أمثلة

اسم الدالة call مع الدوال البانية

يمكننا استخدام call لإنشاء سلسلة من الدوال البانية (chain of constructors) لأحد الكائنات بما يشبه لغة Java، ففي المثال الآتي سنُعرِّف دالةً بانيةً للكائن Product مع معاملين هما name و price، وسننشِئ دالتين باسم Food و Type اللتين تستدعيا الدالة Product مع تمرير this و name و price؛ وبالتالي ستُعرِّف الدالة Product الخاصيتين name و price التابعتين لكل كائن، لكن كل دالة تُعرِّف قيمة category خاصة بها:

function Product(name, price) {
  this.name = name;
  this.price = price;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = 'toy';
}

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

استخدام call لاستدعاء دالة مجهولة

سنُنشِئ في المثال الآتي دالةً مجهولةً وسنستخدم call لاستدعائها على كل كائن في مصفوفة، والغرض الرئيسي من الدالة المجهولة هو إضافة دالة طباعة (print) إلى كل كائن، والتي ستكون قادرةً على طباعة الفهرس الصحيح للكائن في المصفوفة؛ لاحظ أنَّ تمرير الكائن كقيمة this لم يكن ضروريًا، لكننا فعلناه لشرح هذه الفكرة:

var animals = [
  { species: 'Lion', name: 'King' },
  { species: 'Whale', name: 'Fail' }
];

for (var i = 0; i < animals.length; i++) {
  (function(i) {
    this.print = function() {
      console.log('#' + i + ' ' + this.species
                  + ': ' + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

استخدام call لاستدعاء دالة وتحديد قيمة this فيها

function greet() {
  var reply = [this.person, 'Is An Awesome', this.role].join(' ');
  console.log(reply);
}

var i = {
  person: 'Douglas Crockford', role: 'Javascript Developer'
};

greet.call(i); // Douglas Crockford Is An Awesome Javascript Developer

استخدام call لاستدعاء دالة دون تحديد قيمة لأوّل وسيط

استدعينا في المثال الآتي الدالة display لكن دون تمرير قيمة للوسيط الأول، فلو لم تُمرَّر قيمة لأوّل وسيط فستُشير this داخل الدالة إلى الكائن العام:

var sData = 'Wisen';
            
function display(){
    console.log('sData value is %s ', this.sData);
}

display.call(); //sData value is Wisen

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات