תחום הכרזה
סקירה כללית

כאשר דנים בתחום הכרזה, ישנם שלושה מושגי יסוד: תחום הכרזה (scope), היקף (extent) והקשר (context). לעיתים קרובות מתבלבלים בין "תחום הכרזה" ו"הקשר": תחום הכרזה הוא מאפיין של קישור שם, בעוד שהקשר הוא מאפיין של חלק מתוכנית, כלומר חלק מקוד המקור (הקשר לקסיקלי או הקשר סטטי) או חלק מזמן הריצה (הקשר ביצוע, הקשר זמן ריצה, הקשר קריאה או הקשר דינמי). הקשר ביצוע מורכב מהקשר לקסיקלי (בנקודת הביצוע הנוכחית) בתוספת מצב זמן ריצה כגון מחסנית הקריאות. אם נרצה לדייק, במהלך ריצה, התוכנית נכנסת ויוצאת מתחומי הכרזה שונים של קישורי שמות, ובכל נקודה במהלך הריצה קישורי שמות הם "בהקשר" או "לא בהקשר", ומכאן שקישורי שמות "נכנסים להקשר" או "יוצאים מהקשר" כאשר ריצת התוכנית נכנסת או יוצאת מתחום ההכרזה. עם זאת, בפועל השימוש במונחים הוא הרבה יותר רופף.
תחום הכרזה הוא מושג ברמת קוד מקור, ומאפיין של קישורי שמות, במיוחד קישורי שמות של משתנים או פונקציות - שמות בקוד המקור הם הפניות לישויות בתוכנית - והוא חלק מההתנהגות של מהדר או מפרש של שפה. ככאלה, סוגיות של תחום הכרזה דומות למצביעים, שהם סוג של הפניה המשמשת בתוכניות באופן כללי יותר. שימוש בערך של משתנה כאשר השם נמצא בהקשר אך המשתנה אינו מאותחל הוא אנלוגי לפנייה - גישה לערך - של מצביע פראי, מכיוון שהוא לא מוגדר. עם זאת, מכיוון שמשתנים אינם נהרסים עד שהם יוצאים מהקשרם, המצב האנלוגי למצביע מתנדנד אינו קיים.
עבור ישויות כגון משתנים, תחום הכרזה הוא תת-קבוצה של משך חיים (הידוע גם בשם היקף) - שם יכול להתייחס רק למשתנה שקיים (אף אם ערכו לא מוגדר), אבל משתנים שקיימים אינם בהכרח גלויים: משתנה עשוי להתקיים אך להיות בלתי נגיש (הערך מאוחסן אך לא מתייחס אליו בהקשר נתון), או נגיש אך לא באמצעות השם הפרטי, ובמקרה זה אינו בהקשר (התוכנית "מחוץ לתחום ההכרזה של השם"). במקרים אחרים "אורך חיים" אינו רלוונטי - לתווית (מיקום בעל שם בקוד המקור) יש אורך חיים זהה לתוכנית (עבור שפות הידור סטטי), אך עשוי להיות בהקשר או שלא בנקודה נתונה בתוכנית, וכמו כן עבור משתנים סטטיים - משתנה סטטי גלובלי נמצא בהקשר עבור כל התוכנית, בעוד שמשתנה סטטי מקומי נמצא בהקשר רק בתוך פונקציה או הקשר מקומי אחר, אך לשניהם יש אורך חיים של כל הריצה של התוכנית.
הקביעה לאיזו ישות שם מתייחס ידועה כפענוח שם (name resolution) או קישור שמות (name binding) (במיוחד בתכנות מונחה עצמים), ומשתנה בין השפות. בהינתן שם, השפה (ולמעשה, המהדר או המפרש) בודקת את כל הישויות שנמצאות בהקשר עבור התאמות; במקרה של אי בהירות (שתי ישויות עם אותו שם, כגון משתנה גלובלי ומקומי באותו שם), כללי פענוח השם משמשים להבחין ביניהן. לרוב, פענוח שמות מסתמך על כלל "מההקשר הפנימי לחיצוני", כגון הכלל של Python LEGB (Local, Enclosing, Global, Built-in): שמות מפוענחים, בהיעדר הגדרה מפורשת, להקשר הרלוונטי הצר ביותר. במקרים מסוימים ניתן לציין במפורש את פענוח השם הרצוי, כגון על ידי מילות המפתח global ו-nonlocal ב-Python; במקרים אחרים לא ניתן לעקוף את כללי ברירת המחדל.
כאשר שני שמות זהים נמצאים בהקשר בו-זמנית, ומתייחסים לישויות שונות, אומרים שמתרחש מיסוך שמות, כאשר השם בעל העדיפות הגבוהה יותר (בדרך כלל הפנימי ביותר) "מסווה" את השם בעדיפות נמוכה יותר. ברמת המשתנים, זה ידוע בשם הצללת משתנה. בשל הפוטנציאל לשגיאות לוגיות כתוצאה ממיסוך, שפות מסוימות אוסרות או מונעות מיסוך, ומעלות שגיאה או אזהרה בזמן ההידור או בזמן הריצה.
לשפות תכנות שונות יש כללי תחום הכרזה שונים עבור סוגים שונים של הצהרות ושמות. לכללי תחום הכרזה כאלה יש השפעה רבה על סמנטיקה של השפה, וכתוצאה מכך, על ההתנהגות והנכונות של תוכניות. בשפות כמו C++, לגישה למשתנה לא מקושר אין סמנטיקה מוגדרת היטב ועלולה לגרום להתנהגות לא מוגדרת, בדומה להתייחסות למצביע מתנדנד; והצהרות או שמות משמשים מחוץ לתחום ההכרזה שלהם ייצרו שגיאות תחביר.
תחומי הכרזה קשורים לעיתים קרובות למבני שפה אחרים ונקבעים באופן מרומז, אך שפות רבות מציעות גם מבנים ספציפיים לשליטה בתחום ההכרזה.