انتقل إلى محتوى الدرس
الدرس 46
تاريخ النشر: تاريخ التحديث:
دورة جافا سكريبت

دالة apply مع المصفوفات في JavaScriptJavaScript Function apply Method طريقة تمرير المصفوفات بالدالة apply، ودمج المصفوفات بـ push وapply، وصياغة استدعاء دالة apply

أتقن استخدام دالة apply في JavaScript لتشغيل الدوال بتحديد سياق this وتمرير الوسائط داخل مصفوفة، وقارنها بدالة call مع تطبيقات Math.max ودمج المصفوفات.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
المشاهدات
3,435
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

بينما تتألق دالة .call() عندما تكون الوسائط معدودة ومعلومة مسبقاً لحظة كتابة الكود، تجمع البرامج الواقعية غالباً بياناتها الديناميكية داخل مصفوفة Array — كقراءات الحساسات أو أسعار المنتجات — ثم تحتاج لتمرير عناصرها إلى دالة تنتظر معاملات منفصلة، وهنا يأتي الدور الدقيق للدالة fn.apply().

مخطط عمل دالة apply من تحديد السياق واستلام مصفوفة الوسائط حتى تفكيكها على المعاملات وإرجاع النتيجة

تستقبل الصياغة القياسية fn.apply(thisArg, argsArray) وسيطين اثنين كحد أقصى: الأول هو الكائن المراد ربطه بالكلمة this، والثاني مصفوفة (أو كائن شبيه بالمصفوفة مثل arguments) يفرغ المحرك عناصرها بالترتيب على معاملات الدالة.

JavaScript
function renderTrip(origin, dest, km) {
  return this.driver + ': ' + origin + ' -> ' + dest + ' (' + km + ' km)';
}
const captain = { driver: 'Tariq' };
const routeData = ['Riyadh', 'Dammam', 395];
document.getElementById('apply-out').textContent = renderTrip.apply(captain, routeData);

تتطابق الدالتان .call() و.apply() تماماً في التنفيذ الفوري وتعيين this، وينحصر الفرق الوحيد بينهما في طريقة تغليف الوسائط الممررة؛ وتساعدك القاعدة الذهبية (Apply = Array) و(Call = Commas) على عدم الخلط بينهما أبداً:

الدالةالصياغة القياسيةالحالة الأنسب للاستخدام
fn.call()fn.call(ctx, a, b, c)وسائط ثابتة ومعلومة العدد تُكتب مباشرةً بالفواصل
fn.apply()fn.apply(ctx, [a, b, c])قيم متغيرة العدد مجمعة مسبقاً داخل مصفوفة

تتوقع الدالتان المدمجتان Math.max() وMath.min() أرقاماً منفصلة؛ فإذا مررت لهما مصفوفة مباشرةً ستكون النتيجة NaN! وبما أن دوال Math لا تحتاج إلى this، نمرر null في السياق عبر Math.max.apply(null, scores) لاستخراج أكبر وأصغر قيمة بنظافة.

JavaScript
const scores = [78, 94, 85, 62, 91];
const highest = Math.max.apply(null, scores);
const lowest = Math.min.apply(null, scores);
document.getElementById('max-out').textContent = 'Max: ' + highest + ' | Min: ' + lowest;

إن استدعاء listA.push(listB) مباشرةً يدرج المصفوفة الثانية كعنصر فرعي متداخل؛ أما استدعاء listA.push.apply(listA, listB) فيربط السياق بالمصفوفة الأولى ويفكك عناصر الثانية لتُلحق فرادى في نهايتها مباشرةً.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس صياغة fn.apply(thisArg, argsArray)، وقارنت عملياً بين .call() للفواصل و.apply() للمصفوفات، وحسبت القيم القصوى عبر Math.max.apply()، ودمجت عناصر المصفوفات موضعياً عبر push.apply(). الخطوة التالية: انتقل إلى درس «دالة bind وربط السياق في JavaScript» لإنشاء دوال مثبتة السياق والوسائط المسبقة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 Function.apply() الأسلوب المدمج apply
دالة مدمجة تشغل الدالة فوراً بتحديد سياق this وتمرير كافة وسائطها مجمعة داخل مصفوفة واحدة.
للمراجعة
02 Argument Unpacking تفكيك عناصر المصفوفة للمعاملات
توزيع عناصر المصفوفة وفق ترتيب فهارسها بحيث يذهب كل عنصر إلى المعامل المقابل له في الدالة.
للمراجعة
03 In-Place Array Merge الدمج الموضعي للمصفوفة
إلحاق عناصر مصفوفة ثانية مباشرة داخل المصفوفة الأصلية دون إنشاء مصفوفة ثالثة جديدة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 NaN NaN
Not-a-Number
القيمة الناتجة عند تمرير كائن المصفوفة كاملاً إلى Math.max دون تفكيك عناصره عبر apply.
للمراجعة
02 KM KM
Kilometers Distance Unit
وحدة قياس المسافة بالكيلومتر المستخدمة في مثال تفكيك بيانات الرحلة من المصفوفة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. تنقل بين التبويبين الثاني والثالث في المحاكي لمقارنة تمرير null في Math.max وتمرير المصفوفة نفسها في push.

  2. افتح مثال scores في محرر التجربة وأضف الرقم 99 داخل المصفوفة للتحقق من تحديث القيمة العظمى.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

كم وسيطاً كحد أقصى تستقبل الدالة المدمجة fn.apply(thisArg, argsArray)؟

02

ما الفرق الجوهري الوحيد بين الدالتين fn.call() وfn.apply()؟

03

ماذا يرجع الاستدعاء المباشر Math.max([12, 45, 30]) بدون استخدام دالة apply؟

04

لماذا يُمرر null كوسيط أول في الصيغة Math.max.apply(null, nums)؟

05

مثل دالة call تماماً، يشغل استدعاء fn.apply(ctx, arr) الدالة فوراً ويرجع نتيجتها.

06

ما النتيجة النهائية للمصفوفة a بعد تنفيذ "const a = [1, 2]; a.push.apply(a, [3, 4]);"؟

07

تقبل دالة fn.apply() تمرير الكائن المحلي الشبيه بالمصفوفة arguments كوسيط ثانٍ لها.

08

ماذا يحدث عند تمرير رقم عادي مثل 42 في الوسيط الثاني عبر fn.apply(obj, 42)؟

09

تمرير مصفوفة ضخمة جداً من ملايين العناصر إلى دالة apply قد يتجاوز الحد الأقصى لمكدس الاستدعاءات.

10

ما الناتج الحسابي للتعبير Math.max.apply(null, []) عند تمرير مصفوفة فارغة تماماً؟