--- title: ()Function.prototype.call slug: Web/JavaScript/Reference/Global_Objects/Function/call translation_of: Web/JavaScript/Reference/Global_Objects/Function/call ---
تُستدعَى الوظيفة ()call
على دالة، أول argument لهذه الوظيفة هو قيمة this
الخاصة بالدالة، وال arguments المتبقية (إن وُجدت)، هي arguments الدالة.
ملاحظة : صيغة هذه الوظيفة مماثلة تقريبًا للصيغة الخاصة بـ {{jsxref("Function.prototype.apply", "apply")}} الفرق الوحيد هو ان ()call
تاخذ قائمة من ال arguments محددة بشكل فردي فيما تاخذ ()apply
مصفوفة واحدة من ال arguments.
function.call(thisArg, arg1, arg2, ...)
thisArg
this
المتوفرة في استدعاء الدالة function
. لاحظ أن this
قد لا تكون القيمة الفعلية التي تراها الوظيفة: اذا كانت هذه الوظيفة دالة في {{jsxref("Strict_mode", "non-strict mode", "", 1)}} سيتم استبدال {{jsxref("Global_Objects/null", "null")}} و {{jsxref("Global_Objects/undefined", "undefined")}} بالكائن العام والقيم الاولية ستحول الى كائنات. ...,arg1, arg2
function
.تُرجع نتيجة استدعاء الدالة مع قيمة 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
لإستدعاءها على كل كائن في المصفوفة. الغرض الرئيسي من الدالة المجهولة هو إضافة الدالة 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
Specification | Status | Comment |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Initial definition. Implemented in JavaScript 1.3. |
{{SpecName('ES5.1', '#sec-15.3.4.4', 'Function.prototype.call')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Function.call")}}