البرمجة

تأثير تغيير قيمة this في وعود JavaScript

في هذا السياق، يقوم المُبرمج بتعريف فئة JavaScript تسمى “MyClass” تحتوي على عدة أساليب، حيث تُرجع كل منها وعدًا من نوع “Q promise”. المشكلة تنشأ في أساليب “method2” و “method3” حيث يتم تعيين قيمة “this” بشكل غير متوقع، وتصبح غير معرفة (undefined).

لفهم هذا التصرف غير المتوقع، يجب النظر في كيف يتم استخدام الوعد (Promise) في هذا السياق. عند استدعاء الأساليب باستخدام “then”، يُنشئ Q promise جديد. ولذلك، يتغير سياق “this” داخل الدالة المستدعاة، ويصبح undefined. يُظهر ذلك في “method2” و “method3” عندما يتم طباعة قيمة “this” وتظهر كـ undefined.

لحل هذه المشكلة، تم استخدام دالة “bind” لربط السياق الحالي (المرتبط بـ MyClass) مع الدوال “method2” و “method3”. هذا يعني أنه عند استدعاء هاتين الدالتين، سيتم استخدام السياق المُربوط بدلاً من إنشاء سياق جديد.

في الأساس، يتيح استخدام “bind” لربط الدوال بكائن MyClass، مما يضمن استخدام السياق الصحيح داخلهما. إنها وسيلة فعّالة للتحكم في قيمة “this” في دوال JavaScript، وتحل مشكلة تغيير السياق الناتج عن استخدام الوعود.

لذلك، يمكن القول إن استخدام “.then()” لا يقتل قيمة “this”، ولكنه يؤدي إلى تغيير السياق داخل الدالة المستدعاة، وهو ما يتم تصحيحه بفضل استخدام “bind”.

المزيد من المعلومات

لفهم أكثر حول سبب تغير قيمة “this” داخل الأساليب “method2” و “method3″، يمكننا النظر إلى كيفية عمل الدوال والوعود في JavaScript.

عندما يتم استدعاء دالة باستخدام “then”، يتم إنشاء وعد جديد ويُعدل سياق “this” داخل الدالة المرفقة بـ “then”. في حالة الكود الأصلي، عندما يتم استدعاء “method2” و “method3” باستخدام “then”، يتم تغيير قيمة “this” لتصبح undefined، وذلك لأن السياق داخل الوعد لا يعبر عن الكائن MyClass.

عند استخدام “.bind()”، يتم إنشاء نسخة جديدة من الدالة تحتفظ بالكائن الأصلي كسياق لها. وعند استدعاء “method2” و “method3” باستخدام “bind”، يتم استخدام الكائن MyClass كقيمة “this” داخل الدوال، مما يحل المشكلة.

يمكن أيضًا القول إن هذا السلوك هو نتيجة لتصميم JavaScript حيث يتم تغيير قيمة “this” داخل الدوال تبعًا للسياق الذي تم استدعاء الدالة فيه. وعند استخدام الوعود، يتم إنشاء سياق جديد، مما يؤدي إلى فقدان قيمة “this” الأصلية.

زر الذهاب إلى الأعلى