انتقل إلى محتوى الدرس
الدرس 47
دورة جافا سكريبت

دالة bind وربط السياق في JavaScriptJavaScript Function Bind

أتقن دالة bind في JavaScript لمنع ضياع سياق this عند تمرير الدوال وتثبيت الوسائط المسبقة وحفظ السياق مع تفاعلات الأزرار والمؤقتات ومقارنتها مع call وapply.
أقسام الدرس
5
الأمثلة
3
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

من أشهر الأخطاء البرمجية في JavaScript أخذ مرجع دالة من داخل كائن مثل const fn = account.printBalance; لتشغيلها لاحقاً عند وقوع تفاعل. فبمجرد استدعاء fn() منفردةً بدون نقطة، ينفصل سياق this عن الكائن الأصلي account ويصبح undefined أو يشير لعنصر الزر بدلاً من بيانات الحساب!

مخطط عمل دالة bind في تثبيت سياق الكائن داخل دالة جديدة تعمل بأمان عند استدعائها لاحقاً

بخلاف .call() و.apply()، فإن استدعاء fn.bind(targetObj) لا يشغل الدالة فوراً، بل ينشئ ويرجع دالة جديدة مربوطة (Bound Function) جرى قفل الكلمة this بداخلها نهائياً على الكائن targetObj مهما كانت طريقة استدعائها لاحقاً.

JavaScript
const account = {
  owner: 'Noura',
  points: 340,
  summary: function () { return this.owner + ' has ' + this.points + ' pts'; }
};
const getSummary = account.summary.bind(account);
document.getElementById('bind-out').textContent = getSummary();

تدعم دالة .bind() ميزة هندسية رائعة تُعرف بـ التطبيق الجزئي للوسائط (Partial Application)؛ إذ يمكنك تمرير وسائط أولية بعد السياق مباشرةً لتثبيتها مسبقاً في مطلع معاملات الدالة الجديدة، بحيث يكتفي المستدعي لاحقاً بتمرير المعاملات المتبقية فقط.

JavaScript
function calcTotal(taxRate, price) {
  return price + (price * taxRate);
}
const addSaudiVat = calcTotal.bind(null, 0.15);
document.getElementById('part-out').textContent = '100 SAR -> ' + addSaudiVat(100) + ' SAR';

عند إسناد دالة كائن لتعمل استجابةً لنقر زر مثل btn.onclick = counter.increment.bind(counter) أو بعد مهلة زمنية في المتصفح، تضمن .bind() بقاء this مرتبطةً بكائن البيانات الخاص بك بدلاً من تحولها إلى عنصر الزر أو النافذة العامة.

JavaScript
const counter = {
  clicks: 0,
  step: function () {
    this.clicks += 1;
    document.getElementById('cnt-out').textContent = 'Clicks: ' + this.clicks;
  }
};
document.getElementById('cnt-btn').onclick = counter.step.bind(counter);

تكتمل بـ call وapply وbind ثلاثية التحكم الشامل بسياق التنفيذ في دوال JavaScript، ويُلخص الجدول التالي متى تختار كلاً منها:

الدالةهل تنفذ الدالة فوراً؟شكل تمرير الوسائطالقيمة المرجعة
fn.call(ctx, a, b)نعم، تشغلها في الحالقيم مفردة مفصولة بفواصلناتج تشغيل الدالة الأصلية
fn.apply(ctx, [a, b])نعم، تشغلها في الحالمصفوفة واحدة تضم القيمناتج تشغيل الدالة الأصلية
fn.bind(ctx, a)لا، تجهزها للاستدعاء اللاحقوسائط مسبقة اختيارية بالفواصلدالة جديدة مثبتة السياق
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

شخّصت في هذا الدرس مشكلة ضياع this عند فصل الدوال، وأنشأت دوال مثبتة السياق عبر .bind()، وطبقت تثبيت الوسائط المسبقة، وحفظت السياق مع أزرار التفاعل، وقارنت بين call وapply وbind. الخطوة التالية: انتقل إلى درس «الكتل البرمجية Block Statement في JavaScript» لإتقان العزل الكتلي وحجب المتغيرات.

مشاركة

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

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

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

المصطلحات3

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

0 / 3 مفهومةأول بطاقة، أول خطوة
01 Function.bind() الأسلوب المدمج bind
دالة مدمجة تنشئ وترجع دالة جديدة مثبتة السياق this مع إمكانية تثبيت وسائط أولية مسبقة.
للمراجعة
02 Bound Function الدالة المربوطة
كائن الدالة الجديد الناتج عن استدعاء bind الذي يوجه كل تشغيل لاحق إلى الدالة الأصلية بسياقها المحفوظ.
للمراجعة
03 Partial Application التطبيق الجزئي للوسائط
تثبيت وسيط أولي أو أكثر عبر bind لإنتاج دالة متخصصة تطلب عند استدعائها المعاملات المتبقية فقط.
للمراجعة

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

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

الاختصارات2

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

0 / 2 مفهومةأول بطاقة، أول خطوة
01 VAT VAT
Value Added Tax
ضريبة القيمة المضافة التي جرى تثبيت نسبتها مسبقاً عبر التطبيق الجزئي في دالة bind.
للمراجعة
02 DOM DOM
Document Object Model
نموذج كائنات المستند الذي تستدعي عناصره مثل الأزرار الدوال المربوطة عند نقر المستخدم.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. افتح مثال العداد في محرر التجربة وانقر زر الزيادة عدة مرات للتحقق من حفظ سياق الكائن counter.

  2. بدّل بين التبويبين الأول والثاني في المحاكي لمشاهدة كيف تعالج bind ضياع السياق في الوضع الصارم.

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

مساحة التحدي

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

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

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

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

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

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

بمَ تختلف fn.bind(obj) فور استدعائها عن كلٍّ من fn.call(obj) وfn.apply(obj)؟

02

لماذا يفشل الكود "const f = user.greet; f();" في قراءة user.name داخل الوضع الصارم؟

03

بناءً على "function add(a, b) { return a + b; } const add10 = add.bind(null, 10);"، ما ناتج add10(5)؟

04

بعد إنشاء دالة مربوطة عبر fn.bind(objA)، يمكن تغيير سياقها للكائن الثاني عبر boundFn.call(objB).

05

لماذا نكتب "btn.onclick = counter.step.bind(counter)" بدلاً من تمرير "counter.step" مباشرةً للزر؟

06

استدعاء fn.bind(obj) يترك الدالة الأصلية fn كما هي دون تعديل في الذاكرة وينشئ دالة جديدة مستقلة.

07

ماذا يُسمى أسلوب تثبيت بعض الوسائط الأولية للدالة مسبقاً باستخدام bind()؟

08

استدعاء fn.bind(obj) مرتين منفصلتين ينشئ مرجعي دالتين مختلفين في الذاكرة غير متطابقين بالمساواة الصارمة.

09

أي دالة تختار عندما تريد تجهيز دالة بسياق محدد بحيث لا تعمل إلا لاحقاً عند نقر المستخدم؟

10

ما البادئة النصية التي تضيفها JavaScript تلقائياً إلى خاصية name للدالة المنشأة عبر bind()؟