If you do not find what you're looking for, you can use more accurate words.
تقدم معظم لغات البرمجة الشائعة طريقة لإنشاء متغير محلي "Local varibale" في وظيفة أو روتين فرعي: متغير ينتهي نطاقه (يخرج من السياق) عندما تعود الدالة. في معظم الحالات ، يكون عمر المتغير هو مدة استدعاء الدالة - وهو متغير تلقائي "automatic variable"، يتم إنشاؤه عند بدء الدالة (أو يتم الإعلان عن المتغير) ، يتم إتلافها عند إرجاع الدالة - في حين يكون نطاق المتغير داخل وظيفة ، على الرغم من أن معنى "داخل" يعتمد على ما إذا كان scoping معجمية أو ديناميكية. ومع ذلك ، فإن بعض اللغات ، مثل C ، توفر أيضًا للمتغيرات المحلية الثابتة ، حيث يمثل عمر المتغير عمر البرنامج بأكمله ، ولكن المتغير يكون فقط في السياق عندما يكون داخل الدالة. في حالة المتغيرات المحلية الثابتة ، يتم إنشاء المتغير عند تهيئة البرنامج ، ويتم إتلافه فقط عند إنهاء البرنامج ، كما هو الحال مع متغير عام ثابت "static global variable"، ولكن في سياق داخل دالة فقط ، مثل متغير محلي تلقائي " automatic local variable".
والأهم من ذلك ، في تحديد المدى المعجمى ، فإن المتغير مع نطاق الوظيفة له نطاق فقط داخل السياق المفاهيمي للدالة: إنه يتحرك خارج السياق عندما يتم استدعاء دالة أخرى داخل الدالة ، وينتقل إلى السياق عندما تعود الدالة - لا تدعى الدوال للمتغيرات المحلية لوظائف الاستدعاء ، والمتغيرات المحلية هي فقط في سياق داخل جسم الوظيفة التي يتم الإعلان عنها. على النقيض من ذلك ، في النطاق الديناميكي ، يمتد النطاق إلى سياق وقت التشغيل الخاص بالوظيفة: تظل المتغيرات المحلية في السياق عندما يتم استدعاء دالة أخرى ، فقط تتحرك خارج السياق عند انتهاء وظيفة التعريف ، وبالتالي تكون المتغيرات المحلية في سياق الدالة التي يتم تعريفها وجميع وظائف تسمى. في اللغات مع تحديد المدى المعنوي والوظائف المتداخلة ، تكون المتغيرات المحلية في سياق الدوال المتداخلة ، حيث أن هذه هي ضمن السياق المعجمي نفسه ، ولكن ليس في الوظائف الأخرى غير المتداخلة معًا. يُعرف المتغير المحلي لدالة تضمين كمتغير غير محلي للدالة المتداخلة. نطاق الوظيفة ينطبق أيضا على وظائف مجهولة.
def square(n): return n * n def sum_of_squares(n): total = 0 i = 0 while i <= n: total += square(i) i += 1 return total
على سبيل المثال ، في مقتطف شفرة Python على اليمين ، يتم تعريف وظيفتين: square و sum_of_squares. مربع يحسب مربع العدد. يحسب sum_of_squares مجموع كل المربعات إلى رقم. (على سبيل المثال ، المربع (4) هو 42 = 16 ، و sum_of_squares (4) هو 02 + 12 + 22 + 32 + 42 = 30.)
كل من هذه الوظائف له متغير اسمه n يمثل الوسيط للدالة. هذان المتغيران n منفصلان تمامًا ولا يرتبطان ببعضهما ، على الرغم من وجودهما بنفس الاسم ، نظرًا لأنهما متغيرين نطاقًا محليًا مع نطاق وظيفي: نطاق كل منهما هو وظيفته المنفصلة ، وبالتالي لا يتداخلان. لذلك ، يمكن لـ sum_of_squares استدعاء مربع بدون تغيير n الخاص بها. وبالمثل يحتوي sum_of_squares على متغيرات باسم "i" ؛ هذه المتغيرات ، نظرًا لنطاقها المحدود ، لن تتداخل مع أي متغيرات تُسمى "الإجمالي" أو "i" والتي قد تنتمي إلى أي وظيفة أخرى. وبعبارة أخرى ، لا يوجد خطر اصطدام اسم بين هذه المعرفات وأية معرّفات لا علاقة لها ، حتى لو كانت متطابقة.
لاحظ أيضًا أنه لا يتم إخفاء أي اسم: لا يوجد سوى متغير واحد اسمه n في السياق في أي وقت ، نظرًا لعدم تداخل النطاقات. على النقيض من ذلك ، كانت هناك قطعة مماثلة مكتوبة بلغة ذات نطاق ديناميكي ، فإن n في وظيفة الاستدعاء ستبقى في السياق في الدالة المطلوبة - ستتداخل النطاقات - وتكون ملثمة ("مظللة") بواسطة n الجديدة في وظيفة تسمى.
نطاق الوظيفة أكثر تعقيدًا بشكل ملحوظ إذا كانت الدوال كائنات من الدرجة الأولى ويمكن إنشاؤها محليًا إلى وظيفة ثم إعادتها. في هذه الحالة ، فإن أي متغيرات في الدالة المتداخلة غير المحلية إليها (المتغيرات غير المتضمنة في تعريف الدالة ، التي تحل إلى المتغيرات في سياق مضمّن) تنشئ إغلاقًا ، ليس فقط في الوظيفة نفسها ، ولكن أيضًا بيئتها (للمتغيرات ) يجب إرجاعها ، ومن المحتمل أن يتم استدعاؤها في سياق مختلف. وهذا يتطلب دعمًا كبيرًا من المترجم ، ويمكن أن يعقد تحليل البرنامج.