الرفع
مفهوم الرفع
الرفع ( Hoisting ) يقصد به جعل الوصول إلى المتغيرات و الدوال ممكناً من خارج المكان الذي تم تعريفها فيه.
قد يبدو لك هذا الأمر غريباً بعض الشيء و لكنك ستفهم كيف أن ذلك متاحاً في جافاسكربت عندما تفهم كيف يتعامل مفسر الكود معها.
الرفع في جافاسكرب يتم بشكل تلقائي و حصري على المتغيرات التي لم يتم تحديد نوعها و الدوال.
رفع نطاق المتغيرات
عند تعريف المتغير باستخدام الأسلوب التلقائي، أي عند تعريفه بدون استخدام إحدى الكلمات المفتاحية
لا يمكن إعادة تعريف المتغير باستعمال
رفع نطاق المتغير إلى الأعلى
في المثال التالي قمنا بتعريف دالة إسمها
هنا على الرغم من أن المتغير
مثال
<!DOCTYPE html>
<html>
<body>
<script>
// demo هنا قمنا بتعريف دالة إسمها
function demo() {
// true هنا قمنا بوضع جملة شرط و ستتنفذ لأن جواب الشرط فيها يساوي
if (true) {
// و قيمته 10 x هنا قمنا بتعريف متغير عام إسمه
x = 10;
// x هنا قمنا بطباعة قيمة المتغير
document.write('x inside the if statement scope = ' + x + '<br>');
}
// من جديد x هنا قمنا بطباعة قيمة المتغير
document.write('x inside the function scope = ' + x + '<br>');
}
// حتى تتنفذ demo() هنا قمنا باستدعاء الدالة
demo();
// demo() الذي سبق و تم تعريفه في الدالة x هنا قمنا بطباعة قيمة المتغير
document.write('x inside the global scope = ' + x);
</script>
</body>
</html>
النتيجة
x inside the function scope = 10
x inside the global scope = 10
إعادة تحديد نطاق المتغير
فيما يلي سنقوم بإعادة المثال و لكننا هذه المرة سنقوم بإعادة تحديد نطاق المتغير
الفرق بين هذا المثال و المثال السابق أنه عند محاولة الوصول إلى المتغير
مثال
<!DOCTYPE html>
<html>
<body>
<script>
// demo هنا قمنا بتعريف دالة إسمها
function demo() {
// true هنا قمنا بوضع جملة شرط و ستتنفذ لأن جواب الشرط فيها يساوي
if (true) {
// و قيمته 10 x هنا قمنا بتعريف متغير عام إسمه
x = 10;
// من جديد مع عدم تغيير قيمته الحالية x هنا قمنا بتعريف المتغير
var x;
// و لاحظ أنها بقيت 10 x هنا قمنا بطباعة قيمة المتغير
document.write('x inside the if statement scope = ' + x + '<br>');
}
// من جديد x هنا قمنا بطباعة قيمة المتغير
document.write('x inside the function scope = ' + x + '<br>');
}
// حتى تتنفذ demo() هنا قمنا باستدعاء الدالة
demo();
// demo() الذي سبق و تم تعريفه في الدالة x هنا حاولنا طباعة قيمة المتغير
// يمكن الوصول إليه من داخل الدالة فقط x تنفيذ هذا الأمر سيسبب مشكلة لأن المتغير
document.write('x inside the global scope = ' + x);
</script>
</body>
</html>
// demo() الذي سبق و تم تعريفه في الدالة x هنا حاولنا طباعة قيمة المتغير
// يمكن الوصول إليه من داخل الدالة فقط x تنفيذ هذا الأمر سيسبب مشكلة لأن المتغير
document.write('x inside the global scope = ' + x);
النتيجة في الصفحة
x inside the function scope = 10
الخطأ في الكونسول
رفع نطاق الدوال
الدوال في جافاسكربت يتم رفعها بشكل تلقائي لأعلى نطاق مما يعني أنه بالإمكان استدعاء الدالة قبل أن يتم تعريفها.
الرفع التلقائي للدوال سببه أن مفسر الكود سيقوم بالبحث عن الدالة عندما يتم استدعائها و لهذا فإنه لا يهتم أين هي موجودة في الأصل.
في المثال التالي قمنا باستدعاء إسمها
مثال
<!DOCTYPE html>
<html>
<body>
<script>
// حتى تتنفذ demo() هنا قمنا باستدعاء الدالة
demo();
// demo هنا قمنا بتعريف الدالة
function demo() {
document.write('demo is called');
}
</script>
</body>
</html>
النتيجة
في الدرس التالي ستتعلم كيف تستطيع إعلام مفسر جافاسكربت أنك تريد إيقاف استعمال أسلوب الرفع التلقائي مما يجعلك مجبر على تعريف الأشياء قبل أن تتمكن من استعمالها.