لديك حساب بالفعل؟ دخول
دخول  سجل الأن 
[تحسين] نطاق المتغيرات .
في الفصول القادمة ستصبح الأكواد أكثر تعقيدا و ستقوم بتعريف العديد من المتغيرات و الدوال داخل الكود و لذلك كان لابد قبل أن ندخل فيهم أن تتعرف على مفهوم نطاق المتغيرات Variable Scope. نطاق المتغيرات Variable Scope:نطاق المتغير يحدد المنطقة التي يمكنك فيها أن تستخدم المتغير و تجري تعديلات علي البينات الموجودة به ,حيث يمكنك أن تجعل المتغير يمكن إستخدامه فقط داخل دالة,أو يكون عام يمكن إستخدامه و الوصول له في أي مكان في الكود. المتغير الذي يمكنك إستخدامه داخل دالة ما فقط يسمى بالمتغير المحلي local variable,أما المتغير الذي يمكنك الوصول له في أي مكان في الكود يسمى بالمتغير العام global variable. لجعل المتغير متغير محلي تعرفه بإستخدام كلمة var داخل الدالة كما بالمثال :
function test()
{
var age = 43
}
test()
document.write(age + "<BR>")
إذا قمت بتنفيذ هذا الكود في الكنسول ستجد هذا الخطأ ReferenceError: age is not defined حيث أن age معرف داخل الدالة test كمتغير محلي بإستخدام الكلمة var و لذا لا يمكن إستخدامه خارجها . أما إن قمت بحذف كلمة var و صار الكود هكذا
function test()
{
age = 43
}
test()
document.write(age + "<BR>")
فإنه سيتم طباعة الرقم 43 على الصفحة ,لاحظ أنه قبل إستخدام المتغير age خارج الدالة لابد من مناداة الدالة test(). و السبب في أن المتغير تم طباعته هذه المرة أنك إن قمت بتعريف المتغير داخل الدالة بدون إستخدام كلمة var فإنه يعتبر متغير عام و يمكنك إستخدامه خارج الدالة في أي مكان في الكود بعد إستدعاء الدالة .أما المتغير إن تم تعريفه خارج الدالة بإستخدام كلمة var أو بدونها فإنه يعتبر متغير عام و يمكن إستخدامه داخل الدالة أو خارجها كما بالأمثلة: بإستخدام var
function test()
{
var age = 43
}
var age=11
test()
document.write(age + "<BR>")
بدون إستخدام var
function test()
{
var age = 43
}
age = 11
test()
document.write(age + "<BR>") 
و في الحالتين سيتم طباعة الرقم 11 لأن المتغير age داخل الدالة تم تعريف كمتغير محلي و لذا لن يؤثر خارج الدالة و ستظل قيمة المتغير العام age تساوي 11 برغم من مناداة الدالة test() بعد تعريفه . أما إن جعلنا المتغير age داخل الدالة متغير عام أي عرفناه بدون استخدام كلمة var كالتالي:
function test()
{
age = 43
}
age = 11
test()
document.write(age + "<BR>")
فإنه سيتم طباعة الرقم 43 على الشاشة لأن المتغير في هذه الحالة سيؤثر خارج الدالة و بما أنه تم مناداة الدالة بعد age = 11 فإن القيمة الأخيرة له ستكون التي تضعها الدالة و هي 43 . و للتوضيح أكثر سندرس هذا المثال و هو عبارة عن دالة لحساب مساحة شكل هندسي :
scope
<!DOCTYPE html>

<html>
<head>
    <title>Untitled PageLesson 6: Example 1</title>
    <script type="text/javascript">
     function shapeArea(base, height, shape) {
    var area = 0;
    
    function triangle() {
        area = (base * .5) * height;
    }
    
    function rectangle() {
        area = base * height;
    }

    switch (shape) {
        case "triangle":
            triangle();
            break;
        
        case "rectangle":
            rectangle();
            break;
        
        case "square":
            rectangle();
            break;
    }
    
    return area;
}
     
       var area = shapeArea(2, 2, "square");
        alert(area);

      
    </script>
</head>
<body>

</body>
</html>

حاول بنفسك »اضغط على "حاول بنفسك" لكى ترى كيف تعمل فى الحقيقة

في المثال قمنا بتعريف دالة كبرى shapeArea تقبل ثلاث متغيرات و داخلها قمنا بتعريف متغير area كمتغير محلي بالنسبة للدالة shapeArea و أيضا قمنا بتعريف دالتين داخل الدالة هما rectangle و التي تقوم بحساب المساحة في حالة كان الشكل مربع او مستطيل و دالة triangle تقوم بحساب المساحة في حالة كان الشكل مثلث . المتغير المحلي area يمكن إستخدامه في أي مكان داخل الدالة shapeArea و هذا ما فعلناه حيث تم إستخدامه داخل الدالة rectangle و الدالة triangle ,و إستخدمناه داخلهم بدون إستخدام كلمة var ,لأنه إذا إستخدمنا كلمة var داخل الدالة rectangle أو triangle سيصبح المتغير وقتها خاص بالدالة rectangle أو triangle فقط, و لن تتغير قيمة المتغير area المعرف في أول الدالة shapeArea بتغير قيمة المتغير area الموجود داخل rectangle أو triangle. عندما يتم إستدعاء الدالة من خلال هذا السطر
var area = shapeArea(2, 2, "square");
فإنه يبدأ تنفيذ الكود الموجود داخل الدالة shapeArea كالتالي:
  • يتم تعريف المتغير area ووضع قيمته صفر
  • var area = 0;
  • يتم تعريف الدالتين rectangle و triangle .
  • في حالة كون النوع square ستنفذ الدالة rectangle(); و التي ستجعل قيمة المتغير area تساوي
  • area = base * height;

    فيكون الناتج 4 و هو القيمةسترجعها الدالة return area;
  • لاحظ أننا أيضا قمنا بتعريف متغير area خارج الدالة shapeArea و قيمته ليست قيمة المتغير area الموجود داخل shapeArea لأننا كما ذكرنا قمنا بتعريف area داخل shapeArea كمتغير محلي .
26 / نوفمبر / 2011 الساعة 11:27