اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

هذا سلوك في الجافاسكريبت يستخدم لتعريف الدوال والمتغيرات قبل موقعها في الكود، تخيل انه يرفعها إلى أعلى الكود او الscope الذي يتم تعريفها فيه فمثلاً إن كتبت هذا الكود :- 
 

var x = 5;
function NewFun(){
	var y = 7;
	return y;
}

NewFun()

سيتم اعتباره وفهمه كالتالي 
 

var x;
x = 5;
function NewFun(){
	var y;
	y = 7;
	return y;
}

NewFun()

 لاحظ ان التعريفات ترفع إلى الأعلى ولكن القيم نفسها لا ترفع .. لذا توخى الحذر وافهم جيداً هذا السلوك حتى تتجنب تداخلات غير مرغوب فيها.

  • 0
نشر

في جافاسكريبت، Hoisting يعني أن تعريفات الدوال (functions) والإعلانات عن المتغيرات (variables declared with var) يتم رفعها إلى أعلى نطاقها (scope) قبل تنفيذ الكود. هذا لا يعني أن الكود يتم نقله فعليًا إلى الأعلى، بل يعني أن البيئة التنفيذية لجافاسكريبت تتعامل مع هذه الإعلانات كأنها موجودة في الأعلى.

تخيل أنك في فصل دراسي، ولديك قائمة بأسماء الطلاب الذين يجب أن يقدموا عرضًا اليوم. عندما يبدأ اليوم الدراسي، يكتب المعلم أسماء الطلاب الذين سيقدمون على السبورة حتى قبل أن يبدأوا في العرض. هذا يعني أن الجميع في الفصل يعرف من سيقدم حتى قبل أن يحين دورهم. في عالم البرمجة، هذه العملية تشبه "Hoisting".

في JavaScript، "Hoisting" هو سلوك يتم بموجبه "رفع" تعريفات الدوال (functions) والمتغيرات (variables) إلى أعلى النطاق الذي تم تعريفها فيه، وذلك قبل تنفيذ أي كود. هذا يعني أنه يمكنك استدعاء دالة أو استخدام متغير قبل أن يتم تعريفه في الكود.

console.log(x); // undefined
var x = 5;
console.log(x); // 5

في المثال أعلاه، عندما نحاول طباعة قيمة x قبل تعريفه، لا نحصل على خطأ، بل نحصل على قيمة undefined. هذا لأن المتغير x تم "رفعه" إلى الأعلى، لكن دون تعيين قيمة له بعد. فقط عندما نصل إلى السطر الذي يعرّف x ويعطيه قيمة، يمكن استخدام هذه القيمة.

مهم أن نعرف أن "Hoisting" يعمل بشكل مختلف قليلًا بين الدوال والمتغيرات. للدوال، يتم رفع تعريف الدالة بأكمله، مما يعني أنه يمكن استدعاء الدالة حتى قبل تعريفها في الكود

sayHello();

function sayHello() {
  console.log("مرحباً!");
}

هنا، حتى وإن تم استدعاء sayHello() قبل تعريفها، البرنامج يعمل دون مشكلة ويطبع "مرحباً!".

لكن بالنسبة للمتغيرات المعرفة باستخدام let أو const، فإن "Hoisting" لا يعمل بنفس الطريقة؛ يتم رفع المتغير لكن لا يمكن استخدامه قبل تعريفه

console.log(y); // ReferenceError: y is not defined
let y = 5;

في هذا المثال، محاولة استخدام y قبل تعريفه تؤدي إلى خطأ.

النقطة الرئيسية هي أن "Hoisting" يجعل بعض الأجزاء من الكود متاحة للاستخدام قبل أن يتم تنفيذ سطورها فعليًا، ولكن يجب استخدامها بحكمة لتجنب الارتباك أو الأخطاء غير المتوقعة في البرنامج.

 

  • 0
نشر

بالإضافة للشرح السابق نحتاج لنفهم لماذا تم إنشاء ما يسمى بال hoisting وما الفائدة منه حيث قد يبدو ال hoisting عشوائيًا وغير ضروري، خاصةً فيما يتعلق بالمتغيرات. فلماذا لا تُجبر جميع الأكواد على تعريف المتغيرات والدوال  في أعلى النطاق؟

نشأ ال hoisting بشكل غير مقصود حيث كان الهدف هو تجنب الإجبار في تنفيذ الكود  من أعلى إلى أسفل مثل لغات Lisp.

أسباب تتعلق بأداء ال interpreter: حيث خلال تجميع الكود، يقوم interpreter بتحليله إلى أجزاء أصغر. يسمح بنقل تعريف الدوال إلى أعلى نطاقها بتنفيذها مباشرة من الذاكرة، مما قد يحسن الأداء. بينما لا يكون لتأثير hoisting على المتغيرات تأثير كبير على الأداء

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...