أحد الجوانب المهمة للبرمجة هو نطاق المتغيرات. يحدد النطاق أين وكيف يمكن استخدام المتغير.
عندما يتم الإعلان عن متغير داخل دالة بنفس اسم متغير خارجي ، يتم إخفاء المتغير الخارجي داخل الدالة. أي أنه المتغير المحلي الذي سيتم استخدامه داخل الوظيفة ، وليس المتغير الخارجي.
هذا يمكن أن يؤدي إلى نتائج غير متوقعة وأخطاء البرنامج. إذا كنت بحاجة إلى استخدام متغير خارجي بنفس اسم المتغير المحلي داخل الوظيفة ، فيجب عليك تحديد متغير خارجي بشكل صريح.
لتحديد استخدام متغير خارجي بشكل صريح ، يمكنك استخدام الكلمة الرئيسية العامة أو تمرير المتغير كوسيطة إلى دالة.
- تأثير إعلان متغير داخل دالة على متغير خارجي
- تغيير قيمة متغير داخلي
- عدم توافق النوع المتغير
- إنشاء متغير جديد داخل دالة
- خسارة قيمة متغير خارجي
- سؤال وجواب
- ماذا يحدث إذا تم الإعلان عن متغير بنفس اسم المتغير الخارجي داخل الوظيفة?
- كيف إعلان متغير بنفس الاسم داخل وظيفة تؤثر?
- ماذا يحدث إذا تم الإعلان عن المتغيرات التي تحمل نفس الأسماء داخل الوظيفة وخارج النطاق?
- كيف تعمل أولوية المتغيرات عند التصريح بنفس الأسماء داخل الوظيفة وخارج النطاق?
- ماذا يحدث إذا تم الإعلان عن متغير بنفس اسم المتغير العام داخل الوظيفة?
تأثير إعلان متغير داخل دالة على متغير خارجي
عندما يتم الإعلان عن متغير يحمل نفس اسم متغير خارجي داخل دالة ، يحدث تعارض في الاسم. اعتمادا على نطاق المتغيرات ، قد يختلف السلوك بشكل كبير.
مجال الرؤية الصعب (الوضع الصارم)
في الوضع الصارم ، والذي يمكن تمكينه باستخدام توجيه" استخدام صارم " ، يؤدي إعلان متغير داخل دالة بنفس اسم متغير خارجي إلى إنشاء متغير محلي جديد يتجاوز المتغير الخارجي داخل الوظيفة. يبقى المتغير الخارجي دون تغيير.
"'جافا سكريبت
"استخدام صارم";
دعونا س = 5;
مثال الوظيفة () {
السماح س = 10;
وحدة التحكم.سجل (خ) ؛ / / النواتج 10
}
مثال();
وحدة التحكم.سجل (خ) ؛ / / النواتج 5
«`
مجال الرؤية غير الجامد
في نطاق غير جامد ، يؤثر إعلان متغير داخل دالة بنفس اسم متغير خارجي على المتغير الخارجي داخل وبعد استدعاء الوظيفة. ستكون التغييرات التي تم إجراؤها داخل الوظيفة مرئية حتى بعد اكتمالها.
"'جافا سكريبت
دعونا س = 5;
مثال الوظيفة () {
السماح س = 10;
وحدة التحكم.سجل (خ) ؛ / / النواتج 10
}
مثال();
وحدة التحكم.سجل (خ) ؛ / / النواتج 10
"`
ترجع هذه النتيجة إلى حقيقة أنه داخل الوظيفة ، يتم إنشاء متغير بنفس الاسم بواسطة متغير محلي داخلي ، ويتداخل مع المتغير الخارجي. بعد انتهاء تنفيذ الوظيفة ، لم يعد المتغير المحلي موجودا ، ويستعيد المتغير الخارجي قيمته.
يجب الانتباه إلى نطاقات المتغيرات ، خاصة عند استخدام المتغيرات التي تحمل الاسم نفسه في الوظائف المتداخلة. يمكن أن تؤدي إدارة النطاق غير الصحيحة إلى نتائج وأخطاء غير متوقعة في الكود.
تغيير قيمة متغير داخلي
عند الإعلان عن متغير بنفس الاسم داخل دالة ، يتم إخفاء متغير خارجي بنفس الاسم. هذا يعني أنه سيتم استخدام المتغير الداخلي فقط داخل الوظيفة ، وليس المتغير الخارجي.
النظر في المثال التالي:
"'جافا سكريبت
السماح س = 10;
وظيفة فو () {
دعونا س = 5;
وحدة التحكم.سجل (خ);
}
فو () ؛ / / النواتج 5
وحدة التحكم.سجل (خ) ؛ / / النواتج 10
"`
في هذه الحالة ، يتم الإعلان عن المتغير `س` مع القيمة 5 داخل وظيفة 'فو'. عند استدعاء وظيفة وإخراج قيمة المتغير ' س ' داخله ، فإن القيمة 5 يكون الإخراج.
ومع ذلك ، عند إخراج قيمة المتغير `س` خارج الدالة ، سيتم استخدام متغير خارجي مع القيمة 10.
وبالتالي ، إذا كان هناك متغير يحمل نفس الاسم داخل الوظيفة ، فلن تتغير قيمة المتغير الخارجي ولن تكون متاحة داخل الوظيفة.
عدم توافق الأنواع المتغيرة
عند الإعلان عن متغير يحمل نفس الاسم داخل دالة كمتغير خارجي ، يحدث عدم توافق بين أنواع المتغيرات ، مما قد يتسبب في سلوك برنامج غير متوقع.
عندما تعلن دالة عن متغير بنفس اسم متغير خارجي ، يمكن أن يؤدي ذلك إلى تعارض في الاسم وإعادة تعريف قيمة المتغير. ومع ذلك ، قد لا تكون قيم الأنواع المختلفة متوافقة ، مما سيؤدي إلى أخطاء أو سلوك غير متوقع للبرنامج.
على سبيل المثال:
دع أ = 10; // إعلان المتغير الخارجي أ
اختبار وظيفة () {
دع أ = "سلسلة" ؛ / / إعلان متغير بنفس الاسم داخل
وحدة التحكم.دالة السجل(أ) ؛ / / إخراج قيمة المتغير أ داخل الدالة
}
اختبار () ؛ / / الدعوة
وحدة التحكم.وظيفة السجل(أ) ؛ / / إخراج قيمة المتغير الخارجي أ
نتيجة تنفيذ هذا الرمز:
- قيمة المتغير أ هي الإخراج داخل الوظيفة:"سلسلة".
- قيمة المتغير الخارجي أ: 10 هو الإخراج.
يتم تفسير هذا السلوك من خلال حقيقة أن المتغير الذي يحمل نفس الاسم داخل دالة له الأسبقية على متغير خارجي ويتجاوز قيمته. ومع ذلك ، قد تكون قيم الأنواع المختلفة ، مثل رقم وسلسلة ، غير متوافقة ، مما يؤدي إلى نتائج غير متوقعة.
لتجنب عدم توافق أنواع المتغيرات وتعارضات الأسماء ، يجب عليك اختيار أسماء المتغيرات بعناية وتجنب إعادة تعريف المتغيرات الخارجية داخل الوظائف. يوصى أيضا باستخدام وضع جافا سكريبت الصارم ('استخدام صارم') ، مما يساعد على تحديد ومنع المشاكل المحتملة مع أنواع وأسماء المتغيرات.
إنشاء متغير جديد داخل دالة
عندما يتم الإعلان عن متغير يحمل نفس اسم متغير خارجي داخل دالة ، يتم إنشاء متغير محلي جديد. المتغير المحلي له أولوية أعلى عند الوصول إليه من داخل الوظيفة ، لذلك سيتم استخدامه بدلا من متغير خارجي بنفس الاسم.
مثال:
"'جافا سكريبت
فار س = 5;
وظيفة ميفونكتيون () {
فار س = 10؛ / / إنشاء متغير محلي جديد اسمه س
وحدة التحكم.سجل (خ) ؛ / / النواتج 10
}
وظيفتي();
وحدة التحكم.سجل (خ) ؛ / / النواتج 5
«`
في المثال أعلاه ، يتم الإعلان عن المتغير `س ' كمتغير عمومي خارج الدالة ، بالإضافة إلى متغير محلي داخل الدالة. عند استدعاء 'ميفونكتيون () 'وظيفة' قيمة المتغير المحلي سيكون الناتج يساوي 10. عند الوصول إلى المتغير ' س ' خارج الدالة ، سيتم استخدام قيمة المتغير العالمي يساوي 5.
من المهم ملاحظة أن إنشاء متغير جديد داخل دالة بنفس الاسم لا يؤثر على قيمة أو وجود متغير خارجي. تظل مستقلة ولها معاني مختلفة.
إذا كنت بحاجة إلى استخدام قيمة متغير خارجي بنفس الاسم داخل الدالة ، يمكنك استخدام الكلمة الأساسية ' هذا ' للوصول إلى الكائن العمومي:
"'جافا سكريبت
فار س = 5;
وظيفة ميفونكتيون () {
فار س = هذا.x;
وحدة التحكم.سجل (خ) ؛ / / النواتج 5
}
وظيفتي();
"`
في هذه الحالة ، فإن المتغير ' س 'داخل وظيفة تحتوي على قيمة المتغير العالمي 'س'.
بشكل عام ، يمكن أن يكون إنشاء متغير جديد داخل دالة بنفس الاسم مفيدا لعزل وإدارة قيمة المتغير ضمن سياق معين.
خسارة قيمة متغير خارجي
في جافا سكريبت ، يمكن أن يؤدي إعلان متغير يحمل نفس الاسم داخل دالة كمتغير خارجي إلى فقد قيمة المتغير الخارجي.
النظر في المثال التالي:
وظيفة فو () {
فار س = 10;
وحدة التحكم.سجل ("داخل وظيفة س =" ، س);
فار س = 20;
وحدة التحكم.سجل ("داخل الدالة بعد إعلان متغير جديد س =" ، س);
}
فار س = 5;
وحدة التحكم.سجل ("قبل استدعاء وظيفة س =" ، س);
فو();
وحدة التحكم.سجل ("بعد استدعاء وظيفة س =" ، س);
، ولكن مع القيمة 10. في وحدة التحكم ، سنرى الإخراج التالي:
قبل استدعاء وظيفة س = 5
داخل وظيفة س = 10
داخل الدالة بعد إعلان متغير جديد س = 20
بعد استدعاء وظيفة س = 5
في النطاق العالمي لا يزال يساوي 5.
هذا لأنه عند الإعلان عن متغير يحمل نفس الاسم داخل دالة ، يحدث ما يسمى بـ "خسارة" قيمة المتغير الخارجي. متغير جديد بنفس الاسم يمنع الوصول إلى متغير خارجي داخل الوظيفة.
لتجنب فقدان قيمة متغير خارجي ، يمكنك استخدام أسماء متغيرات أخرى أو لف الكود الذي يتم فيه الإعلان عن المتغير الجديد داخل كتلة دالة غير مسماة:
(وظيفة () {
فار س = 10;
وحدة التحكم.سجل ("داخل كتلة وظيفة غير مسمى س =" ، س);
فار س = 20;
وحدة التحكم.سجل ("داخل كتلة دالة غير مسماة بعد إعلان متغير جديد س =" ، س);
})();
فار س = 5;
وحدة التحكم.سجل ("بعد كتلة الدالة غير المسماة س =" ، س);
الآن سيكون الإخراج على النحو التالي:
داخل كتلة وظيفة غير مسمى س = 10
داخل كتلة دالة غير مسماة بعد إعلان متغير جديد س = 20
بعد كتلة من وظيفة لم يذكر اسمه س = 5
يتم إنشاؤه في النطاق المحلي للكتلة ولا يؤثر على متغير خارجي بنفس الاسم.
سؤال وجواب
ماذا يحدث إذا تم الإعلان عن متغير بنفس اسم المتغير الخارجي داخل الوظيفة?
إذا تم الإعلان عن متغير يحمل نفس اسم المتغير الخارجي داخل الوظيفة ، فسيكون للمتغير الداخلي الأسبقية على المتغير الخارجي. هذا يعني أنه سيتم استخدام قيمة المتغير الداخلي داخل الوظيفة ، وليس المتغير الخارجي.
كيف إعلان متغير بنفس الاسم داخل وظيفة تؤثر?
إذا تم الإعلان عن متغير يحمل نفس الاسم داخل دالة ، فإن جميع عمليات الوصول إلى هذا المتغير داخل الدالة ستشير إلى المتغير الداخلي ، وليس إلى المتغير الخارجي. قد يؤثر هذا على نتائج الوظيفة.
ماذا يحدث إذا تم الإعلان عن المتغيرات التي تحمل نفس الأسماء داخل الوظيفة وخارج النطاق?
في هذه الحالة ، سيتم إعادة تعريف المتغير داخل الوظيفة. عند الوصول إلى هذا المتغير داخل الوظيفة ، سيتم استخدام قيمة المتغير الداخلي ، وليس المتغير الخارجي.
كيف تعمل أولوية المتغيرات عند التصريح بنفس الأسماء داخل الوظيفة وخارج النطاق?
عند التصريح عن المتغيرات التي لها نفس الأسماء داخل دالة ونطاق خارجي ، يكون للمتغير المعلن داخل الدالة الأسبقية على المتغير الخارجي. هذا يعني أنه سيتم استخدام قيمة المتغير الداخلي داخل الوظيفة.
ماذا يحدث إذا تم الإعلان عن متغير بنفس اسم المتغير العام داخل الوظيفة?
إذا تم الإعلان عن متغير يحمل نفس اسم المتغير العمومي داخل الوظيفة ، فسيكون للمتغير الداخلي الأسبقية على المتغير العمومي. هذا يعني أنه سيتم استخدام قيمة المتغير الداخلي داخل الوظيفة ، وليس المتغير العالمي.