الفرق بين المراجعتين لصفحة: «JavaScript/Function/call»
لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
سطر 111: | سطر 111: | ||
*معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4 ECMAScript 5.1]. | *معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4 ECMAScript 5.1]. | ||
*معيار [http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf ECMAScript 1st Edition]. | *معيار [http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf ECMAScript 1st Edition]. | ||
[[تصنيف:JavaScript]] | [[تصنيف:JavaScript|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Global Objects]] | [[تصنيف:JavaScript Global Objects|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Function]] | [[تصنيف:JavaScript Function|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 15:38، 28 يناير 2018
الدالة 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 |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 1st Edition.