٢.٤ النطاق في JavaScript¶
النطاق العام¶
التمرين 1: صرّح عن متغير جديد باسم myVarوأسند إليه 100، ثم اعرض myVar في وحدة التحكم.
var myVar = 100;
console.log(myVar);
النتيجة هي: 100
التمرين 2: أنشئ دالة جديدة تعرض قيمة myVar، ولا تنسَ استدعاءها.
var myVar = 100;
function displayVar(){
console.log(myVar);
}
displayVar();
النتيجة هي: 100
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل التنفيذ.
- يُعرّف الدالة ويهيّئها
displayVar. - يضبط
myVarعلىundefined. - ثم ينفّذ المحرّك التعليمات سطرًا بسطر.
- يُسنِد 100 إلى
myVar. - ينفّذ تعليمات الدالة ويعرض 100 في وحدة التحكم.
كما ترى، المتغير myVar مُعرّف في المستوى الرئيسي للشيفرة. استطعنا الوصول إلى قيمته myVar من داخل displayVar ؟
النطاق
النطاق يحدّد المواضع التي يمكن الوصول منها إلى متغير في الشيفرة.
النطاق العام
النطاق العام هو النطاق الخارجي الذي يمكن الوصول إلى متغيراته من النطاقات الداخلية، ما لم يحجبها متغير محلي بالاسم نفسه.
التمرين 3: تأمّل الشيفرة وحاول فهم النتيجة.
displayVar();
function displayVar(){
console.log(myVar);
}
var myVar = 100;
النتيجة هي: undefined
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل التنفيذ.
- يُعرّف الدالة ويهيّئها
displayVar. - يضبط
myVarعلىundefined. - ثم ينفّذ المحرّك التعليمات سطرًا بسطر.
- يستدعي الدالة
displayVar، وتعرضundefinedفي وحدة التحكم - يُسنِد 100 إلى
myVar.
التمرين 4: ارجع إلى التمرين 3؛ هل myVar مُعرّف في النطاق العام؟
نعم، myVar مُعرّف في النطاق العام ومتاح من داخل الدوال في مثالنا.
التمرين 5: صرّح عن متغير باسم username في النطاق العام. صِل إليه واعرضه داخل دالة.
var username = "Nawras";
function displayUsername(){
console.log(username);
}
displayUsername();
ستكون النتيجة: Nawras
ملاحظة
يمكن الوصول إلى متغيرات النطاق العام من داخل الدوال.
التمرين 6: تأمّل الشيفرة وافهم النتيجة.
function displayVar(){
console.log(myVar);
}
var myVar = 100;
displayVar();
ستكون النتيجة: 100
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل التنفيذ.
- يُعرّف الدالة ويهيّئها
displayVar. - يضبط
myVarعلىundefined. - ثم ينفّذ المحرّك الشيفرة سطرًا بسطر.
- يُسنِد 100 إلى
myVar. - يستدعي الدالة
displayVar. تعرض 100 في وحدة التحكم.
التمرين 7: ارجع إلى التمرين 6؛ هل myVar مُعرّف في النطاق العام؟
نعم، myVar مُعرّف في النطاق العام ومتاح من داخل الدوال في مثالنا.
النطاق المحلي¶
التمرين 8: تأمّل الشيفرة وافهم النتيجة.
function setUsername(){
var username = "Ali";
}
setUsername();
console.log(username);
النتيجة هي: Uncaught ReferenceError: username is not defined
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل التنفيذ.
- يُعرّف الدالة ويهيّئها
setUsername. - ثم ينفّذ المحرّك الشيفرة سطرًا بسطر.
- يستدعي الدالة
setUsername. - يُسنِد "Ali" إلى
username. المتغيرusernameمتاح فقط داخل الدالةsetUsername. - يحاول الوصول إلى
usernameخارج الدالة، لكنه يفشل. لماذا؟
متغيرات النطاق المحلي
المتغيرات المحلية للدالة تُعرَّف داخلها، وتكون متاحة ضمن نطاقها.
ملاحظة
لا يمكنك الوصول مباشرةً إلى متغيرات الدالة المحلية من خارجها.
التمرين 9: تأمّل الشيفرة وافهم النتيجة.
displayHello("Nawras");
console.log(greet);
function displayHello(name){
var greet = "Hello " + name;
}
النتيجة هي: Uncaught ReferenceError: greet is not defined
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل التنفيذ.
- يُعرّف الدالة ويهيّئها
displayHello. - ثم ينفّذ المحرّك الشيفرة سطرًا بسطر.
- يستدعي الدالة
displayHello()بالقيمة "Nawras". - يُسنِد "Hello Nawras" إلى
greet. المتغيرgreetمتاح فقط داخل الدالةdisplayHello(). - يحاول الوصول إلى
greetخارج الدالة، لكنه يفشل لأن المتغيرgreetمحلي للدالةdisplayHello
ملاحظة
نطاق المتغير greet يُسمّى أيضًا نطاق الدالة، لأنه متاح داخلها فقط.
التمرين 10: تأمّل الشيفرة وافهم النتيجة.
function setUsername(){
var username = "Ali";
console.log(username);
}
var username = "Nawras";
console.log(username);
setUsername();
console.log(username);
النتيجة كما يلي:
Nawras
Ali
Nawras
كيف تعمل الشيفرة السابقة؟
- يجهّز محرّك JavaScript التصريحات قبل تنفيذ التعليمات.
- يُعرّف الدالة ويهيّئها
setUsername. - يُسنِد
undefinedإلى المتغيرusername. - ثم ينفّذ المحرّك التعليمات سطرًا بسطر.
- يُسنِد "Nawras" إلى
username. - يبحث عن متغير باسم
usernameفي النطاق العام. - يعرض قيمة المتغير العام
username، وهي "Nawras". - يستدعي الدالة
setUsername(). - يُسنِد "Ali" إلى المتغير المحلي
username. console.log(username): يبحث عنusernameفي نطاق الدالة، ويجدusername = "Ali"، فتظهر "Ali".- يبحث عن متغير باسم
usernameفي النطاق العام. - يعرض قيمة المتغير العام
username، وهي "Nawras".
سلسلة النطاقات
عند استخدام متغير، يبحث المحرّك عنه بدءًا من أقرب نطاق.
يبدأ البحث في النطاق المحلي، ثم يتدرّج إلى النطاقات الخارجية حتى النطاق العام. إذا لم يجد المتغير، يحدث ReferenceError.
تُسمّى هذه العملية سلسلة النطاقات.
التمرين 11: ما نتيجة الشيفرة التالية؟
function multiplyByTwo(num){
var result = num * 2;
console.log(result);
}
var result = 5;
console.log(result);
multiplyByTwo(6);
النتيجة كما يلي:
5
12
التمرين 12: ارجع إلى التمرين 11؛ لماذا يظهر 5 أولًا؟
تبحث JavaScript عن المتغير result في أقرب نطاق، وهو هنا النطاق العام. وفيه result قيمته 5.
التمرين 13: ارجع إلى التمرين 11؛ لماذا يظهر 12 ثانيًا؟
تبحث JavaScript عن المتغير result في أقرب نطاق، وهو نطاق الدالة. وفيه result قيمته 12.
التمرين 14: ما نتيجة الشيفرة التالية؟
function multiplyByTwo(num){
console.log(result);
}
var result = 5;
console.log(result);
multiplyByTwo(6);
النتيجة كما يلي:
5
5
التمرين 15: ارجع إلى التمرين 14؛ لماذا يظهر 5 أولًا؟
تبحث JavaScript عن المتغير result في أقرب نطاق، وهو هنا النطاق العام. وفيه result قيمته 5.
التمرين 16: ارجع إلى التمرين 14؛ لماذا يظهر 5 ثانيًا؟
تبحث JavaScript عن المتغير result في أقرب نطاق، وهو نطاق الدالة. وفيه result غير مُعرّف، فتبحث عن result في النطاق العام. وفيه result قيمته 5.
سنتعلّم عن نطاق الكتلة (Block) و والنطاق المعجمي (Lexical) لاحقًا في الدورة.