This translation is incomplete. Please help translate this article from English
تُستدعَى الوظيفة ()call على دالة، أول argument لهذه الوظيفة هو قيمة this الخاصة بالدالة، وال arguments المتبقية (إن وُجدت)، هي arguments الدالة.
ملاحظة : صيغة هذه الوظيفة مماثلة تقريبًا للصيغة الخاصة بـ apply الفرق الوحيد هو ان ()call تاخذ قائمة من ال arguments محددة بشكل فردي فيما تاخذ ()apply مصفوفة واحدة من ال arguments.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
صيغة الوظيفة call
function.call(thisArg, arg1, arg2, ...)
Parameters
thisArg- اختياري. وهو قيمة
thisالمتوفرة في استدعاء الدالةfunction. لاحظ أنthisقد لا تكون القيمة الفعلية التي تراها الوظيفة: اذا كانت هذه الوظيفة دالة في non-strict mode سيتم استبدالnullوundefinedبالكائن العام والقيم الاولية ستحول الى كائنات. ...,arg1, arg2- arguments الدالة
function.
Return value
ترجع نتيجة استدعاء الدالة مع قيمة this المحددة و ال arguments.
وصف
تسمح الوظيفة ()call لدالة او وظيفة خاصة بكائن واحد بان يتم استدعاؤها وتعيينها من قبل كائن مختلف.
تمنح الوظيفة ()call قيمة this الجديدة الى الدالة/الوظيفة. مع الـ call يمكنك كتابة الوظيفة مرة واحدة ومن ثم تقوم بتوريثها لكائن آخر دون الحاجة إلى إعادة كتابة الوظيفة للكائن الجديد.
تحليل الجزء الغامض في الوظيفة ()call
نظرا لعدم وجود شرح كاف حول هذه الجزئية فقد ارتايت ان اظيف هذه الفقرة التوضيحية لعلها تزيح بعض الغموض عن قيمة ال this التي تمثل ال argument الاول لهذه الوظيفة.
اذا نظرنا بتمعن في هذا الجزء من داخل الوظيفة call. سنجد ان thisArg ستساوي الكائن العام في حالة undefined او null، والا ستساوي ناتج الكائن Object، تساوي thisArg كائنا في كلتا الحالتين. وعليه فقد اصبحت كائنا، اذن فمن الطبيعي ان تمتلك خصائص. تم تحديد الخاصية _callTemp_ قيمتها this و this تمثل الدالة التي ستستدعى عليها الوظيفة call. واخيرا يتم تنفيذ هذه الدالة:
Function.prototype.call_like = function( thisArg, args ){
thisArg = ( thisArg === undefined || thisArg === null ) ? window : Object( thisArg );
thisArg._callTemp_ = this;
thisArg._callTemp_();
}
في حالة عدم وجود thisArg ستتصرف الدالة fn بشكل طبيعي و this ستساوي الكائن العام:
var fn = function () {
console.log( this ); // [object Window]
}
fn.call_like();
في حالة وجود thisArg بقيمة اولية ك undefined او null ف this ستساوي ايضا الكائن العام، خلاف ذالك سيتم تمرير قيمتها الى الكائن ()Object، اذا كانت هذه القيمة من القيم الاولية-primitive value سيقوم الكائن بتحويلها الى الكائن المناسب لها، واما اذا كانت هذه القيمة كائنا فلا حاجة لتحويلها و this ستساوي كائنا.
وهذا يفسر كيف قام الكائن Object بتحويل القيمة الاولية "Youssef belmeskine" الى الكائن String:
var fn = function () {
console.log( this ); // "Youssef belmeskine"
console.log( this === "Youssef belmeskine" ); // false
console.log( String(this) === "Youssef belmeskine" ); // true
}
fn.call_like( "Youssef belmeskine" );
من المهم دائما ذكر المصدر:
بالنسبة لى شخصيا لم اتمكن من فهم هذه الوظيفة وشقيقتها apply بشكل واضح الا عندما قمت بالاطلاع على الكود الداخلى لها. قمت باستخدام هذا الجزء من الكود لتوضيح الفكرة فقط. ستجد ال Polyfill كاملا في هذا الموقع hexmen.com.
أمثلة
استخدام ال call لِسَلسَلة منشئات الكائن
تستطيع إستخدام call لعمل تسلسل لمنشئات-constructors الكائن، وذلك على غرار جافا. في المثال التالي، تم تحديد منشئ الكائن Product مع اثنين من البارامترات name و price. والدالتات Food و Toy تستدعيان 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 لإستدعاء الدالة المجهولة الاسم-anonymous function
في هذا المثال قمنا بانشاء الدالة المجهولة واستخدمنا 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 لاستدعاء دالة وتحديد السياق-context ل this
في المثال أدناه، عندما سنقوم باستدعاء greet سترتبط قيمة this بالكائن obj.
function greet() {
var reply = [this.animal, 'typically sleep between', this.sleepDuration].join(' ');
console.log(reply);
}
var obj = {
animal: 'cats', sleepDuration: '12 and 16 hours'
};
greet.call(obj); // cats typically sleep between 12 and 16 hours
إستخدام الـcall لاستدعاء دالة وبدون تحديد البرامتر الاول
في المثال أدناه ،قمنا باستدعاء الدالة display من دون تمرير البرامتر الاول. إذا لم يتم تمرير قيمة this في البرامتر الاول فسترتبط بالكائن العام-global object.
var sData = 'Wisen';
function display(){
console.log('sData value is %s ', this.sData);
}
display.call(); // sData value is Wisen
تذكر ان قيمة this ستكون ب undefined في الوضع الصارم. انظر ادناه:
'use strict';
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // Cannot read the property of 'sData' of undefined
Specifications
| Specification | Status | Comment |
|---|---|---|
| ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.3. |
| ECMAScript 5.1 (ECMA-262) The definition of 'Function.prototype.call' in that specification. |
Standard | |
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Function.prototype.call' in that specification. |
Standard | |
| ECMAScript (ECMA-262) The definition of 'Function.prototype.call' in that specification. |
Living Standard |
Browser compatibility
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
call | Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | IE Full support 5.5 | Opera Full support 4 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox Android Full support 4 | Opera Android Full support 10.1 | Safari iOS Full support 1 | Samsung Internet Android Full support 1.0 | nodejs Full support Yes |
Legend
- Full support
- Full support