في الواقع، السبب وراء عدم حدوث خطأ في هذا الكود هو أن JavaScript تتعامل مع الكائنات المعقدة (Objects) بشكل مختلف عن المتغيرات الأساسية مثل الأعداد والسلاسل النصية. عندما تقوم بإنشاء كائن في JavaScript، يتم تخصيص مساحة في الذاكرة لتخزين الكائن ومؤشر (reference) لهذا الكائن.
في الكود الذي قمت بتقديمه، عندما تقوم بإنشاء كائن من الدالة main
باستخدام new main()
، يتم إنشاء كائن جديد في الذاكرة وتعيين الخاصية first
لتشير إلى نفس الكائن الجديد الذي تم إنشاؤه. وعند استخدام console.log(new main().first);
، يتم طباعة القيمة التي يشير إليها first
، والتي هي الكائن نفسه.
لذا، بدلاً من رمي خطأ، تسمح JavaScript بإنشاء الكائنات بشكل تكراري بسبب طريقة تعاملها مع إدارة الذاكرة والمؤشرات. تكرار هذا النوع من الكود قد يؤدي في النهاية إلى نفاد الذاكرة (out of memory)، لكن JavaScript لا تفرض قيود صارمة على عمليات الإنشاء الريكورسية.
المزيد من المعلومات
بالطبع! في JavaScript، عندما تقوم بإنشاء كائن باستخدام الكلمة الرئيسية new
، يحدث الآتي:
- تُنشأ كائن جديد من النوع المعين (في هذه الحالة، الدالة
main
). - يتم تخصيص مساحة في الذاكرة لتخزين هذا الكائن.
- يتم تعيين قيمة
this
داخل الدالة لتشير إلى الكائن الجديد.
في الكود الذي قدمته، دالة main
تنشئ كائنًا جديدًا وتعيّن الخاصية first
لتشير إلى الكائن نفسه. ولكن عند استخدام console.log(new main().first);
، يتم طباعة القيمة التي يشير إليها first
، والتي هي الكائن نفسه. تحدث هذه العملية بدون أي خطأ لأن JavaScript لا تمنع بشكل صارم إنشاء الكائنات بشكل تكراري، بل تعامل معها بشكل طبيعي.