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

دالة call وتمرير السياق في JavaScriptJavaScript Function call Method طريقة تحديد السياق بالدالة call، وتمرير الوسائط مفردة call، ومفهوم سياق التنفيذ this

تحكم في سياق التنفيذ this عبر دالة call في JavaScript بتحديد الكائن المستقبِل وتمرير الوسائط مفردة واستعارة الدوال بين الكائنات وفهم سلوك الوضع الصارم.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
المشاهدات
4,015
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

داخل الدوال القياسية في JavaScript لا تشير الكلمة المحجوزة this بصورة جامدة إلى مكان كتابة الدالة، بل تمثل سياق التنفيذ (Execution Context) أي الكائن المستقبِل الذي يتحدد لحظة تشغيلها. وفي كثير من البرامج نكتب دالة خدمة واحدة ونرغب في تشغيلها على بيانات عدة كائنات مختلفة دون نسخ الدالة داخل كل كائن.

مخطط يوضح كيف تربط دالة call سياق this بالكائن المحدد وتمرر الوسائط مفردة للتنفيذ الفوري

بما أن كل دالة في JavaScript هي كائن متكامل، فإنها تمتلك أسلوباً مدمجاً يُدعى .call(thisArg). يؤدي استدعاء fn.call(targetObj) إلى تشغيل الدالة fn في الحال مع توجيه الكلمة this بداخلها لتشير صراحةً إلى الكائن targetObj خلال هذه الاستدعاءة:

طريقة التشغيلالكائن الذي تشير إليه thisالمرونة مع الكائنات الأخرى
branchA.describe()تلقائياً الكائن branchA قبل النقطةتعمل فقط إذا كانت الدالة مخزنة داخل الكائن
describe.call(branchB)صراحةً الكائن branchB المرسل أولاًتعمل مع أي كائن يمتلك نفس أسماء خصائص البيانات
JavaScript
function readBadge() {
  return this.city + ' Hub (#' + this.code + ')';
}
const hubA = { city: 'Riyadh', code: 101 };
const hubB = { city: 'Jeddah', code: 204 };
document.getElementById('call-out').textContent = readBadge.call(hubB);

عندما تطلب الدالة معاملات إضافية إلى جانب سياق this، نمررها إلى .call() مفردةً واحداً تلو الآخر مفصولةً بفواصل بعد كائن السياق مباشرةً بالصيغة fn.call(contextObj, arg1, arg2).

JavaScript
function buildLine(currency, discount) {
  const finalPrice = this.price - discount;
  return this.item + ': ' + finalPrice + ' ' + currency;
}
const product = { item: 'Keyboard', price: 250 };
document.getElementById('args-out').textContent = buildLine.call(product, 'SAR', 30);

تتيح تقنية استعارة الأساليب (Method Borrowing) لكائن أن يستفيد مؤقتاً من دالة معرفة مسبقاً داخل كائن آخر عبر الصيغة ownerObj.method.call(guestObj) دون تكرار كتابة الكود.

يختلف تعامل .call() مع تمرير null أو undefined أو القيم الأولية بحسب تفعيل الوضع الصارم "use strict";:

  • في الوضع غير الصارم القديم: تُستبدل null وundefined خفيةً بكائن النافذة العام window، وتُغلّف الأرقام والنصوص داخل كائنات مغلفة مؤقتة.
  • في الوضع الصارم الحديث: تبقى this مساويةً للقيمة الممررة حرفياً دون تحوير ولا تغليف، مما يحمي النطاق العام من التعديل بالخطأ.
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

أتقنت في هذا الدرس مفهوم سياق التنفيذ this، والتشغيل الفوري بتحديد السياق والوسائط المفردة عبر fn.call(obj, a, b)، واستعارة الدوال بين الكائنات، وحماية الوضع الصارم من السقوط نحو الكائن العام. الخطوة التالية: انتقل إلى درس «استدعاء الدوال والرفع في JavaScript» لمقارنة أنماط الاستدعاء الأربعة والدوال ذاتية التشغيل والعودية.

مشاركة

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

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

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

المصطلحات3

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

0 / 3 مفهومةأول بطاقة، أول خطوة
01 Execution Context (this) سياق التنفيذ this
الكائن أو القيمة المستقبِلة المرتبطة بالكلمة المحجوزة this داخل الدالة خلال استدعاء معين.
للمراجعة
02 Function.call() الأسلوب المدمج call
دالة مدمجة تشغل الدالة فوراً مع ربط this بالكائن المحدد في الوسيط الأول وتمرير بقية الوسائط مفصولة بفواصل.
للمراجعة
03 Method Borrowing استعارة الدوال بين الكائنات
تشغيل أسلوب معرف في كائن واحد على بيانات كائن آخر متوافق البنية باستخدام دالة call.
للمراجعة

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

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

الاختصارات2

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

0 / 2 مفهومةأول بطاقة، أول خطوة
01 JS JS
JavaScript
لغة البرمجة الديناميكية التي تعامل الدوال ككائنات مزودة بأساليب تحكم بالسياق مثل call.
للمراجعة
02 ES5 ES5
ECMAScript 5th Edition
الإصدار القياسي الذي قدم الوضع الصارم لمنع تحول null في دالة call إلى الكائن العام window.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. افتح مثال readBadge في محرر التجربة وبدّل الوسيط من hubB إلى hubA لملاحظة تغير نتيجة this فوراً.

  2. افتح التبويب الثالث في المحاكي التفاعلي للتحقق من بقاء قيمة this مساوية لـ null في الوضع الصارم.

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

مساحة التحدي

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

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

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

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

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

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

ماذا يمثل الوسيط الأول دائماً عند استدعاء الدالة عبر fn.call(...)؟

02

استدعاء fn.call(obj) يشغل الدالة fn وينفذ أوامرها فوراً في نفس اللحظة.

03

كيف تُمرر مدخلات الدالة الإضافية بعد كائن السياق في دالة fn.call()؟

04

أي تعبير مما يلي يستعير الدالة userA.fullName ويشغلها على خصائص الكائن userB؟

05

عند تفعيل الوضع الصارم "use strict"، ما قيمة this داخل الدالة عند استدعائها عبر fn.call(null)؟

06

تشغيل formatter.call(product) يضيف خاصية دائمة باسم formatter داخل الكائن product.

07

في الوضع غير الصارم داخل المتصفح، تمرير undefined إلى fn.call(undefined) يجعل this تشير تلقائياً إلى:

08

تنجح استعارة الدالة متى امتلك الكائن المستهدف الخصائص التي تقرؤها الكلمة this داخل الدالة المستعارة.

09

متى تتحدد قيمة الكلمة المحجوزة this للدالة المكتوبة بالكلمة القياسية function؟

10

في الاستدعاء taxFn.call(order, 0.15, "SAR")، تذهب القيمة 0.15 إلى المعامل الأول في تعريف الدالة taxFn.