У комп'ютерному програмуванні область дії (англ. scope) — зв'язок імені з об'єктом (наприклад, змінною) — це частина програми, де зв'язування імені є дійсним, тобто ім'я може використовуватися для посилання на сутність. В інших частинах програми назва може посилатися на іншу сутність (вона може мати іншу прив'язку) або взагалі ні на що (вона може бути незв'язаною). Область допомагає запобігти зіткненням імен; це дозволяє одній і тій самій назві посилатися на різні об'єкти – якщо імена мають різні області. Область прив'язки імені також відомий як видимість сутності, особливо в старішій або більш технічній літературі — з точки зору сутності, на яку посилається, а не імені, на яке посилається.
Термін «область» також використовується для позначення набору всіх зв'язків імен, дійсних у частині програми або в певній точці програми, що правильніше називати контекстом або середовищем.
У більшості мов програмування межі дії змінної зумовлені місцем її оголошення. Крім того, межі дії можна зазначити явно за допомогою класів пам'яті або просторів імен.
Для більшості мов програмування, «частина програми» відноситься до частини вихідного коду (області тексту) і відома як лексична область видимості. Проте в деяких мовах «частина програми» відноситься до частини часу виконання (проміжку часу під час виконання) і відома як динамічна область. Обидва ці терміни є певною мірою оманливими — вони неправильно використовують технічні терміни, як обговорювалося у визначенні, — але саме розрізнення є точним, і це стандартні відповідні терміни. Лексичний обсяг є основним предметом цієї статті, при цьому динамічний обсяг розуміється на відміну від лексичного обсягу.
Здебільшого розпізнавання імен на основі лексичного обсягу є відносно простим у використанні та реалізації, оскільки під час використання можна читати вихідний код у зворотному напрямку, щоб визначити, до якої сутності відноситься ім'я, а в реалізації можна підтримувати список імен і контексти під час компіляції або інтерпретації програми. Труднощі виникають у , прямих деклараціях і підйомі, тоді як значно тонші виникають із , особливо в замиканнях.
Визначення
Суворе визначення (лексичного) «області» імені (ідентифікатора) є однозначним: лексичний обсяг — це «частина вихідного коду, в якій застосовується зв'язування імені з сутністю». Це практично не змінилося в порівнянні з визначенням 1960 року в специфікації . Типові специфікації мови:
- ALGOL 60 (1960)
- Розрізняють такі види величин: прості змінні, масиви, мітки, перемикачі та процедури. Область дії величини — це набір операторів і виразів, у яких дійсне оголошення ідентифікатора, пов'язаного з цією величиною.
- C (2007)
- Ідентифікатор може позначати об'єкт; функція; тег або член структури, об'єднання або переліку; ім'я ; назва етикетки; ім'я макроса; або параметр макроса. Один і той же ідентифікатор може позначати різні сутності в різних точках програми. [. . . ] Для кожної окремої сутності, яку позначає ідентифікатор, ідентифікатор видимий (тобто може бути використаний) лише в області тексту програми, яка називається її областю.
- Go (2013)
- Оголошення прив'язує непустий ідентифікатор до константи, типу, змінної, функції, мітки або пакета. [. . . ] Область дії оголошеного ідентифікатора — це обсяг вихідного тексту, у якому ідентифікатор позначає вказану константу, тип, змінну, функцію, мітку або пакет.
Найчастіше «область» означає, коли дане ім'я може посилатися на задану змінну — коли оголошення має ефект — але також може застосовуватися до інших сутностей, таких як функції, типи, класи, мітки, константи та переліки.
Лексичний обсяг проти динамічного
Фундаментальна відмінність у сфері застосування полягає в тому, що означає «частина програми». У мовах із лексичною областю видимості (також званою статичною областю видимості) дозвіл імен залежить від розташування у вихідному коді та лексичного контексту (також називається статичним контекстом), який визначається місцем визначення названої змінної або функції. У мовах із динамічною областю розпізнавання імен залежить від стану коли зустрічається ім'я, що визначається контекстом виконання (також званим контекстом виклику або динамічним контекстом). На практиці з лексичним обсягом ім'я розпізнається шляхом пошуку в локальному лексичному контексті, а якщо це не вдається, шляхом пошуку в зовнішньому лексичному контексті тощо; тоді як з динамічною областю ім'я розпізнається шляхом пошуку в локальному контексті виконання, а якщо це не вдається, шляхом пошуку в зовнішньому контексті виконання тощо, просуваючись вгору по стеку викликів.
Більшість сучасних мов використовують лексичну область для змінних і функцій, хоча динамічна область використовується в деяких мовах, зокрема в деяких діалектах Lisp, деяких мовах «сценаріїв» і деяких мовах шаблонів. Perl 5 пропонує як лексичну, так і динамічну область видимості. Навіть у мовах із лексичною областю видимість для замикань може збентежити, оскільки вони залежать від лексичного контексту, де визначено закриття, а не від того, де воно викликається.
Лексичну роздільну здатність можна визначити під , вона також відома як раннє зв'язування, тоді як динамічна роздільна здатність, як правило, може бути визначена лише , і тому відома як пізнє зв'язування .
Споріднені поняття
В об'єктно-орієнтованому програмуванні вибирає метод об'єкта під час виконання, хоча те, чи виконується фактичне зв'язування імені під час компіляції чи під час виконання, залежить від мови. Фактична динамічна область видимості поширена в мовах макросів, які безпосередньо не розпізнають імена, а натомість розширюються на місці.
Деякі фреймворки програмування, такі як AngularJS, використовують термін «область», щоб означати щось зовсім інше, ніж зазначене в цій статті. У цих фреймворках область видимості — це лише об'єкт мови програмування, яку вони використовують (JavaScript у випадку AngularJS), який певним чином використовується фреймворком для емуляції динамічної області видимості в мові, яка використовує лексичну область видимості для своїх змінних. Ці області AngularJS можуть самі бути в контексті або не в контексті (використовуючи звичайне значення терміну) у будь-якій частині програми, дотримуючись звичайних правил змінної області видимості мови, як і будь-якого іншого об'єкта, і використовуючи власне успадкування та правила включення. У контексті AngularJS іноді використовується термін «$scope» (зі знаком долара), щоб уникнути плутанини, але використання знака долара в іменах змінних часто не рекомендовано посібниками зі стилю.
Різновиди змінних залежно від меж дії
У мовах, що підтримують структурне програмування, змінні зазвичай поділяються на два типи залежно від видимості:
- локальні змінні — оголошуються всередині функції і недоступні поза нею;
- глобальні змінні — оголошуються поза всіма функціями і доступні звідусіль[].
Об'єктно-орієнтоване програмування передбачає існування всередині кожного класу трьох нарізних ділянок з особливими межами дії:
- Закрита (англ. private) — межі дії оголошень збігаються з межами класу (посилатися на змінні чи методи можна лише з коду, що належить класові);
- Відкрита (англ. public) — обмеження дії відсутнє, але посилатися на змінні чи методи можна лише через ім'я об'єкта (примірник класу);
- Захищена (англ. protected) — межі дії оголошень відповідають межам класу та всіх його нащадків.
Використання
Область є важливим компонентом розпізнавання , який, у свою чергу, є фундаментальним для семантики мови. Роздільна здатність імен (включаючи область дії) різниться між мовами програмування, а в межах мови програмування залежить від типу сутності; правила для області називаються правилами області (або правилами визначення). Разом із просторами імен правила області видимості є вирішальними в модульному програмуванні, тому зміна в одній частині програми не порушує непов'язану частину.
Огляд
Говорячи про обсяг, існує три основні поняття: обсяг, обсяг і контекст. Область — це властивість зв'язування імені, тоді як контекст — це властивість частини програми, яка є або частиною вихідного коду (лексичним контекстом чи статичним контекстом), або частина виконання (контекст виконання, контекст виклику або динамічний контекст). Контекст виконання складається з лексичного контексту (у поточній точці виконання) плюс додаткового стану виконання, такого як стек викликів. Строго кажучи, під час виконання програма входить і виходить із різних областей прив'язки імен, і в момент виконання прив'язки імен знаходяться «в контексті» або «не в контексті», отже, прив'язки імен «входять у контекст» або «виходити з контексту», коли виконання програми входить або виходить з області видимості. Однак на практиці використання набагато вільніше.
Область — це концепція рівня вихідного коду та властивість зв'язків імен, зокрема зв'язків імен змінних або функцій — імена у вихідному коді є посиланнями на сутності в програмі — і є частиною поведінки компілятора чи інтерпретатора мови. Таким чином, питання обсягу подібні до вказівників, які є типом посилань, що використовуються в програмах більш загально. Використання значення змінної, коли ім'я знаходиться в контексті, але змінна неініціалізована, аналогічно розіменуванню (доступу до значення) завислого вказівника, оскільки він невизначений. Однак, оскільки змінні не знищуються, доки вони не вийдуть з контексту, аналога завислого вказівника не існує.
Для таких сутностей, як змінні, область дії — це підмножина часу (також відома як extent) — ім'я може посилатися лише на змінну, яка існує (можливо, з невизначеним значенням), але існуючі змінні не обов'язково є видимими: змінна може існувати, але бути недоступним (значення зберігається, але не посилається в даному контексті) або доступним, але не через задане ім'я, у цьому випадку воно не в контексті (програма «поза межами імені»). В інших випадках «тривалість життя» не має значення — мітка (іменована позиція у вихідному коді) має тривалість життя, ідентичну програмі (для статично скомпільованих мов), але може бути в контексті чи ні в певній точці програми, а також для статичні змінні — статична глобальна змінна знаходиться в контексті для всієї програми, тоді як статична локальна змінна знаходиться лише в контексті всередині функції або іншого локального контексту, але обидва мають час життя протягом усього виконання програми.
Визначення того, на яку сутність посилається ім'я, відоме як або (зокрема в об'єктно-орієнтованому програмуванні) і залежить від мови. Отримавши назву, мова (власне, компілятор або інтерпретатор) перевіряє всі сутності, які знаходяться в контексті, на відповідність; у разі неоднозначності (дві сутності з однаковою назвою, наприклад глобальна та локальна змінна з однаковою назвою), для їх розрізнення використовуються правила розпізнавання імен. Найчастіше розпізнавання імен спирається на правило «внутрішнього контексту до зовнішнього», наприклад, правило Python LEGB (локальне, охоплююче, глобальне, вбудоване): імена неявно розв'язуються у найвужчому релевантному контексті. У деяких випадках розпізнавання імен може бути явно визначено, наприклад, за допомогою global
і nonlocal
ключових слів у Python; в інших випадках правила за замовчуванням не можна змінити.
Коли дві ідентичні назви знаходяться в контексті одночасно, посилаючись на різні сутності, одне говорить про те, що відбувається , коли ім'я з вищим пріоритетом (зазвичай найвнутрішнє) «маскує» ім'я з нижчим пріоритетом. На рівні змінних це відомо як . Через можливість логічних помилок через маскування деякі мови забороняють або не рекомендують маскувати, викликаючи помилку або попередження під час компіляції чи виконання.
Різні мови програмування мають різні правила області видимості для різних типів оголошень і імен. Такі правила області видимості мають великий вплив на семантику мови і, як наслідок, на поведінку та коректність програм. У таких мовах, як , доступ до незв'язаної змінної не має чітко визначеної семантики та може призвести до невизначеної поведінки, подібної до посилання на завислий вказівник ; і оголошення або імена, що використовуються поза їхньою областю, створюватимуть синтаксичні помилки.
Області часто прив'язані до інших мовних конструкцій і визначаються неявно, але багато мов також пропонують конструкції спеціально для керування областю.
Рівні області
Область може варіюватися від лише одного виразу до всієї програми з багатьма можливими градаціями між ними. Найпростішим правилом видимості є глобальна область видимості — усі сутності видимі в усій програмі. Найпростішим правилом модульної області є дворівнева область, з глобальною областю в будь-якому місці програми та локальною областю в межах функції. Більш складне модульне програмування допускає окрему область модуля, де імена видимі всередині модуля (приватні для модуля), але не видимі за його межами. У межах функції деякі мови, такі як C, дозволяють обмежувати область дії блоку підмножиною функції; інші, особливо функціональні мови, дозволяють обмежувати область виразу одним виразом. Інші області включають область видимості файлу (зокрема в C), яка поводиться подібно до області видимості модуля, і блочну область поза функціями (особливо в Perl).
Проблема полягає в тому, коли саме починається і закінчується область. У деяких мовах, таких як C, область дії імені починається з оголошення імені, і тому різні імена, оголошені в одному блоці, можуть мати різні області видимості. Це вимагає оголошення функцій перед використанням, хоча і не обов'язково їх визначення, і вимагає попереднього оголошення в деяких випадках, зокрема для взаємної рекурсії. В інших мовах, таких як Python, область імені починається на початку відповідного блоку, де ім'я оголошено (наприклад, початок функції), незалежно від того, де воно визначено, тому всі імена в межах даного блоку мають однаковий обсяг. У JavaScript область дії імені, оголошеного за допомогою let
або const
, починається з оголошення імені, а область імені, оголошеного за допомогою var
, починається з початку функції, де оголошено ім'я, що відомо як підйом змінної. Поведінка імен у контексті, які мають невизначене значення, відрізняється: у Python використання невизначених імен призводить до помилки виконання, тоді як у JavaScript невизначені імена, оголошені за допомогою var
, можна використовувати у всій функції, оскільки вони неявно прив'язані до значення undefined
.
Область виразу
Обсяг прив'язки імені — це вираз, який відомий як область виразу. Область виразу доступна в багатьох мовах, особливо у функціональних мовах, які пропонують функцію під назвою let-вирази, що дозволяє області оголошення бути одним виразом. Це зручно, якщо, наприклад, для обчислення потрібне проміжне значення. Наприклад, у Standard ML, якщо f()
повертає 12
, тоді let val x = f() in x * x end
є виразом, який обчислюється як 144
, використовуючи тимчасову змінну з іменем x
, щоб уникнути подвійного виклику f()
. Деякі мови з блочною областю наближають цю функціональність, пропонуючи синтаксис для блоку, який буде вбудовано у вираз; наприклад, вищезгаданий стандартний вираз ML можна записати на Perl як do { my $x = f(); $x * $x }
або в GNU C як ({ int x = f(); x * x; })
.
У Python допоміжні змінні у виразах генератора та розуміння списків (у Python 3) мають область виразу.
У C імена змінних у прототипі функції мають область виразу, відому в цьому контексті як область протоколу функції. Оскільки назви змінних у прототипі не згадуються (вони можуть відрізнятися у фактичному визначенні) — вони є просто фіктивними — їх часто опускають, хоча вони можуть використовуватися, наприклад, для створення документації.
Область блоку
Обсяг прив'язки імені — це блок, який відомий як область блоку. Блокова область доступна в багатьох, але не у всіх мовах програмування з блочною структурою. Це почалося з , де «[кожна] декларація... дійсна лише для цього блоку», і сьогодні це особливо пов'язано з мовами сімейств і традицій Pascal і C. Найчастіше цей блок міститься у функції, таким чином обмежуючи область видимості частиною функції, але в деяких випадках, наприклад у Perl, блок може бути не всередині функції.
unsigned int sum_of_squares(const unsigned int N) { unsigned int ret = 0; for (unsigned int n = 1; n <= N; n++) { const unsigned int n_squared = n * n; ret += n_squared; } return ret; }
Яскравим прикладом використання області видимості блоку є наведений тут код C, де дві змінні обмежені циклом: змінна циклу n, яка ініціалізується один раз і збільшується на кожній ітерації циклу, і допоміжна змінна n_squared, яка ініціалізується на кожній ітерації. Мета полягає в тому, щоб уникнути додавання змінних до області видимості функції, які мають відношення лише до певного блоку, наприклад, це запобігає помилкам, коли загальна змінна циклу i вже була випадково встановлена на інше значення. У цьому прикладі вираз n * n
, як правило, не буде призначено допоміжній змінній, а тіло циклу буде просто написано ret += n * n
, але в більш складних прикладах допоміжні змінні є корисними.
Блоки в основному використовуються для потоку керування, наприклад із циклами if, while і for, і в цих випадках область дії блоку означає, що область дії змінної залежить від структури потоку виконання функції. Однак мови з блочною областю зазвичай також дозволяють використовувати «голі» блоки, єдиною метою яких є можливість детального керування змінною областю. Наприклад, допоміжна змінна може бути визначена в блоці, потім використана (скажімо, додана до змінної з областю дії функції) і відкинута, коли блок закінчується, або цикл while може бути укладений у блок, який ініціалізує змінні, що використовуються всередині циклу який слід ініціалізувати лише один раз.
Тонкість кількох мов програмування, таких як і C (продемонстрована в цьому прикладі та стандартизована з C99 ), полягає в тому, що змінні області видимості блоку можуть бути оголошені не лише в тілі блоку, але також і в операторі керування, якщо будь-який. Це аналогічно параметрам функції, які оголошуються в декларації функції (перед початком блоку тіла функції) і в області видимості для всього тіла функції. Це в основному використовується в циклах for, які мають оператор ініціалізації, окремий від умови циклу, на відміну від циклів while, і є загальною ідіомою.
Область блоку можна використовувати для затінення. У цьому прикладі всередині блоку допоміжну змінну також можна було б назвати n, затіняючи ім'я параметра, але це вважається поганим стилем через можливість помилок. Крім того, деякі нащадки C, такі як Java і C#, незважаючи на підтримку області видимості блоку (тобто локальну змінну можна вивести з контексту до завершення функції), не дозволяють одній локальній змінній приховувати іншу . У таких мовах спроба оголошення другого n призвела б до синтаксичної помилки, і одну з n змінних потрібно було б перейменувати.
Якщо блок використовується для встановлення значення змінної, область дії блоку вимагає, щоб змінна була оголошена поза блоком. Це ускладнює використання умовних операторів з одним призначенням . Наприклад, у Python, який не використовує блокову область, можна ініціалізувати змінну як таку:
if c: a = "foo" else: a = ""
де a
доступний після оператора if
.
У Perl, який має блочну область, замість цього потрібно оголосити змінну перед блоком:
my $a; if (c) { $a = 'foo'; } else { $a = ''; }
Часто замість цього це переписується за допомогою множинного призначення, ініціалізуючи змінну значенням за замовчуванням. У Python (де це не потрібно) це буде:
a = "" if c: a = "foo"
тоді як у Perl це буде:
my $a = ''; if (c) { $a = 'foo'; }
У випадку призначення однієї змінної альтернативою є використання тернарного оператора, щоб уникнути блокування, але це, як правило, неможливо для призначення кількох змінних, і його важко прочитати для складної логіки.
Це більш суттєва проблема в C, особливо для призначення рядка, оскільки ініціалізація рядка може автоматично виділяти пам'ять, тоді як призначення рядка вже ініціалізованій змінній вимагає виділення пам'яті, копії рядка та перевірки їх успішності.
{ my $counter = 0; sub increment_counter { return ++$counter; } }
Деякі мови дозволяють застосовувати концепцію області видимості блоку, в різному ступені, поза функцією. Наприклад, у фрагменті Perl праворуч $counter
— це ім'я змінної з блочною областю (через використання ключового слова my
), тоді як increment_counter
— це ім'я функції з глобальною областю видимості. Кожен виклик increment_counter
збільшить значення $counter
на одиницю та поверне нове значення. Код за межами цього блоку може викликати increment_counter
, але не може інакше отримати або змінити значення $counter
. Ця ідіома дозволяє визначати закриття в Perl.
Область функції
Коли область змінних, оголошених у функції, не виходить за межі цієї функції, це називається областю видимості функції. Область видимості функції доступна в більшості мов програмування, які пропонують спосіб створення локальної змінної у функції або підпрограми : змінної, область дії якої закінчується (що виходить з контексту), коли функція повертається. У більшості випадків час життя змінної дорівнює тривалості виклику функції — це , створена під час запуску функції (або змінна оголошена), знищена, коли функція повертається — тоді як область видимості змінної знаходиться в межах функція, хоча значення "всередині" залежить від того, чи є область лексичною чи динамічною. Однак деякі мови, такі як C, також передбачають статичні локальні змінні, де час життя змінної дорівнює всьому часу життя програми, але змінна знаходиться в контексті лише всередині функції. У випадку статичних локальних змінних змінна створюється під час ініціалізації програми та знищується лише тоді, коли програма завершується, як у випадку зі статичною глобальною змінною, але знаходиться лише в контексті функції, як автоматична локальна змінна.
Важливо, що в лексичній області видимості змінна з областю видимості функції має область видимості лише в межах лексичного контексту функції: вона виходить із контексту, коли інша функція викликається в межах функції, і повертається в контекст, коли функція повертається — викликані функції не мають доступу до локальних змінних функцій, що викликають, і локальні змінні знаходяться лише в контексті всередині тіла функції, в якій вони оголошені. Навпаки, у динамічній області видимості область поширюється на контекст виконання функції: локальні змінні залишаються в контексті, коли викликається інша функція, виходячи з контексту лише після завершення функції, що визначає, і, таким чином, локальні змінні знаходяться в контексті функції в якому вони визначені та всі називаються функціями . У мовах з лексичним обсягом і вкладеними функціями локальні змінні знаходяться в контексті для вкладених функцій, оскільки вони знаходяться в тому самому лексичному контексті, але не для інших функцій, які не є лексично вкладеними. Локальна змінна охоплюючої функції відома як для вкладеної функції. Область дії функції також застосовна до анонімних функцій.
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
. square
обчислює квадрат числа; sum_of_squares
обчислює суму всіх квадратів до числа. (Наприклад, square(4)
дорівнює 4 2 = 16
, а sum_of_squares(4)
дорівнює 0 2 + 1 2 + 2 2 + 3 2 + 4 2 = 30
. )
Кожна з цих функцій має змінну з іменем n, яка представляє аргумент функції. Ці дві n змінних повністю окремі та не пов'язані, незважаючи на те саме ім'я, тому що вони є локальними змінними з лексичною областю видимості з областю видимості функції: область видимості кожної з них є окремою лексично окремою функцією, і тому вони не збігаються. Таким чином, sum_of_squares
може викликати square
без зміни власного n . Так само sum_of_squares
має змінні з іменами total та i ; ці змінні, через їх обмежений обсяг, не заважатимуть будь-яким змінним з іменем total або i, які можуть належати до будь-якої іншої функції. Іншими словами, немає ризику зіткнення імен між цими іменами та будь-якими непов'язаними іменами, навіть якщо вони ідентичні.
Ніякого маскування імен не відбувається: лише одна змінна з іменем n знаходиться в контексті в будь-який момент часу, оскільки області не перекриваються. Навпаки, якби подібний фрагмент був написаний мовою з динамічною областю видимості, n у функції, що викликає, залишався б у контексті викликаної функції — області видимості перекривалися б — і були б замасковані («затінені») новим n у викликаній функції.
Область дії функції значно ускладнюється, якщо функції є об'єктами першого класу і можуть бути створені локально для функції, а потім повернуті. У цьому випадку будь-які змінні у вкладеній функції, які не є локальними для неї (незв'язані змінні у визначенні функції, які перетворюються на змінні в охоплюючому контексті), створюють закриття, оскільки не лише сама функція, але й її контекст (змінних ) потрібно повернути, а потім потенційно викликати в іншому контексті. Це вимагає значно більшої підтримки від компілятора та може ускладнити аналіз програми.
Мови розмітки
Поняття меж дії також стосується мов розмітки. Наприклад, в HTML межі дії імені поля введення (те саме стосується прапорців, ґудзиків тощо) збігаються з межами форми (HTML) від <form> до </form>.
Приклади
C
Приклад областей видимості змінних у мові програмування C:
// Змінна foo має глобальні межі дії int foo = 0; int main() { // Межами дії змінної bar є тіло функції main int bar = 1; }
# include <stdio.h> int a = 0; // Глобальна змінна int main () { printf («% d», a); // Буде виведено число 0 { int a = 1; // Оголошена локальна змінна а, глобальну змінну a не видно printf («% d», a); // Буде виведено число 1 { int a = 2; // Ще локальна змінна в блоці, глобальну змінну a не видно, невидно і попередню локальну змінну printf («% d», a); // Буде виведено число 2 } } }
Примітки
- "Report on the Algorithmic Language Algol 60", 2.7. Quantities, kinds and scopes
- WG14 N1256 (2007 updated version of the C99 standard), 6.2.1 Scopes of identifiers, 2007-09-07
- The Go Programming Language Specification: Declarations and scope, Version of Nov 13, 2013
- Borning A. . University of Washington.
- Crockford, Douglas. Code Conventions for the JavaScript Programming Language. Процитовано 4 січня 2015.
- УРОК 12. локальні змінні І ОБЛАСТЬ ВИДИМОСТІ. Архів оригіналу за 16 березня 2013. Процитовано 11 березня 2013.
- Області видимості. Архів оригіналу за 16 березня 2013. Процитовано 11 березня 2013.
- Backus, J. W.; Wegstein, J. H.; Van Wijngaarden, A.; Woodger, M.; Bauer, F. L.; Green, J.; Katz, C.; McCarthy, J.; Perlis, A. J. (1960). Report on the algorithmic language ALGOL 60. Communications of the ACM. 3 (5): 299. doi:10.1145/367236.367262.
- Functions - Javascript:MDN.
Variables defined inside a function cannot be accessed from anywhere outside the function, because the variable is defined only in the scope of the function. However, a function can access all variables and functions defined inside the scope in which it is defined.
- Специфікація мови HTML (рос.). Переклад: А. Пірамідін. ISBN .
{{}}
: Проігноровано|website=
()
Коментарі
- See definition for meaning of "scope" versus "context".
- "Dynamic scope" bases name resolution on extent (lifetime), not scope, and thus is formally inaccurate.
- For example, the template engine for Python by default uses both lexical scope (for imports) and dynamic scope (for includes), and allows behavior to be specified with keywords; see Import Context Behavior.
- "Name resolution" and "name binding" are largely synonymous; narrowly speaking "resolution" determines to which name a particular use of a name refers, without associating it with any meaning, as in , while "binding" associates the name with an actual meaning. In practice the terms are used interchangeably.
- For the lexical context itself can change during run time.
- By contrast, *"a name binding's context", *"a name binding coming into scope" or *"a name binding going out of scope" are all incorrect—a name binding has scope, while a part of a program has context.
В іншому мовному розділі є повніша стаття Scope (computer science)(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою з англійської. (лютий 2022)
|
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U komp yuternomu programuvanni oblast diyi angl scope zv yazok imeni z ob yektom napriklad zminnoyu ce chastina programi de zv yazuvannya imeni ye dijsnim tobto im ya mozhe vikoristovuvatisya dlya posilannya na sutnist V inshih chastinah programi nazva mozhe posilatisya na inshu sutnist vona mozhe mati inshu priv yazku abo vzagali ni na sho vona mozhe buti nezv yazanoyu Oblast dopomagaye zapobigti zitknennyam imen ce dozvolyaye odnij i tij samij nazvi posilatisya na rizni ob yekti yaksho imena mayut rizni oblasti Oblast priv yazki imeni takozh vidomij yak vidimist sutnosti osoblivo v starishij abo bilsh tehnichnij literaturi z tochki zoru sutnosti na yaku posilayetsya a ne imeni na yake posilayetsya Termin oblast takozh vikoristovuyetsya dlya poznachennya naboru vsih zv yazkiv imen dijsnih u chastini programi abo v pevnij tochci programi sho pravilnishe nazivati kontekstom abo seredovishem U bilshosti mov programuvannya mezhi diyi zminnoyi zumovleni miscem yiyi ogoloshennya Krim togo mezhi diyi mozhna zaznachiti yavno za dopomogoyu klasiv pam yati abo prostoriv imen Dlya bilshosti mov programuvannya chastina programi vidnositsya do chastini vihidnogo kodu oblasti tekstu i vidoma yak leksichna oblast vidimosti Prote v deyakih movah chastina programi vidnositsya do chastini chasu vikonannya promizhku chasu pid chas vikonannya i vidoma yak dinamichna oblast Obidva ci termini ye pevnoyu miroyu omanlivimi voni nepravilno vikoristovuyut tehnichni termini yak obgovoryuvalosya u viznachenni ale same rozriznennya ye tochnim i ce standartni vidpovidni termini Leksichnij obsyag ye osnovnim predmetom ciyeyi statti pri comu dinamichnij obsyag rozumiyetsya na vidminu vid leksichnogo obsyagu Zdebilshogo rozpiznavannya imen na osnovi leksichnogo obsyagu ye vidnosno prostim u vikoristanni ta realizaciyi oskilki pid chas vikoristannya mozhna chitati vihidnij kod u zvorotnomu napryamku shob viznachiti do yakoyi sutnosti vidnositsya im ya a v realizaciyi mozhna pidtrimuvati spisok imen i konteksti pid chas kompilyaciyi abo interpretaciyi programi Trudnoshi vinikayut u pryamih deklaraciyah i pidjomi todi yak znachno tonshi vinikayut iz osoblivo v zamikannyah ViznachennyaSuvore viznachennya leksichnogo oblasti imeni identifikatora ye odnoznachnim leksichnij obsyag ce chastina vihidnogo kodu v yakij zastosovuyetsya zv yazuvannya imeni z sutnistyu Ce praktichno ne zminilosya v porivnyanni z viznachennyam 1960 roku v specifikaciyi Tipovi specifikaciyi movi ALGOL 60 1960 Rozriznyayut taki vidi velichin prosti zminni masivi mitki peremikachi ta proceduri Oblast diyi velichini ce nabir operatoriv i viraziv u yakih dijsne ogoloshennya identifikatora pov yazanogo z ciyeyu velichinoyu C 2007 Identifikator mozhe poznachati ob yekt funkciya teg abo chlen strukturi ob yednannya abo pereliku im ya nazva etiketki im ya makrosa abo parametr makrosa Odin i toj zhe identifikator mozhe poznachati rizni sutnosti v riznih tochkah programi Dlya kozhnoyi okremoyi sutnosti yaku poznachaye identifikator identifikator vidimij tobto mozhe buti vikoristanij lishe v oblasti tekstu programi yaka nazivayetsya yiyi oblastyu Go 2013 Ogoloshennya priv yazuye nepustij identifikator do konstanti tipu zminnoyi funkciyi mitki abo paketa Oblast diyi ogoloshenogo identifikatora ce obsyag vihidnogo tekstu u yakomu identifikator poznachaye vkazanu konstantu tip zminnu funkciyu mitku abo paket Najchastishe oblast oznachaye koli dane im ya mozhe posilatisya na zadanu zminnu koli ogoloshennya maye efekt ale takozh mozhe zastosovuvatisya do inshih sutnostej takih yak funkciyi tipi klasi mitki konstanti ta pereliki Leksichnij obsyag proti dinamichnogo Fundamentalna vidminnist u sferi zastosuvannya polyagaye v tomu sho oznachaye chastina programi U movah iz leksichnoyu oblastyu vidimosti takozh zvanoyu statichnoyu oblastyu vidimosti dozvil imen zalezhit vid roztashuvannya u vihidnomu kodi ta leksichnogo kontekstu takozh nazivayetsya statichnim kontekstom yakij viznachayetsya miscem viznachennya nazvanoyi zminnoyi abo funkciyi U movah iz dinamichnoyu oblastyu rozpiznavannya imen zalezhit vid stanu koli zustrichayetsya im ya sho viznachayetsya kontekstom vikonannya takozh zvanim kontekstom vikliku abo dinamichnim kontekstom Na praktici z leksichnim obsyagom im ya rozpiznayetsya shlyahom poshuku v lokalnomu leksichnomu konteksti a yaksho ce ne vdayetsya shlyahom poshuku v zovnishnomu leksichnomu konteksti tosho todi yak z dinamichnoyu oblastyu im ya rozpiznayetsya shlyahom poshuku v lokalnomu konteksti vikonannya a yaksho ce ne vdayetsya shlyahom poshuku v zovnishnomu konteksti vikonannya tosho prosuvayuchis vgoru po steku viklikiv Bilshist suchasnih mov vikoristovuyut leksichnu oblast dlya zminnih i funkcij hocha dinamichna oblast vikoristovuyetsya v deyakih movah zokrema v deyakih dialektah Lisp deyakih movah scenariyiv i deyakih movah shabloniv Perl 5 proponuye yak leksichnu tak i dinamichnu oblast vidimosti Navit u movah iz leksichnoyu oblastyu vidimist dlya zamikan mozhe zbentezhiti oskilki voni zalezhat vid leksichnogo kontekstu de viznacheno zakrittya a ne vid togo de vono viklikayetsya Leksichnu rozdilnu zdatnist mozhna viznachiti pid vona takozh vidoma yak rannye zv yazuvannya todi yak dinamichna rozdilna zdatnist yak pravilo mozhe buti viznachena lishe i tomu vidoma yak piznye zv yazuvannya Sporidneni ponyattya V ob yektno oriyentovanomu programuvanni vibiraye metod ob yekta pid chas vikonannya hocha te chi vikonuyetsya faktichne zv yazuvannya imeni pid chas kompilyaciyi chi pid chas vikonannya zalezhit vid movi Faktichna dinamichna oblast vidimosti poshirena v movah makrosiv yaki bezposeredno ne rozpiznayut imena a natomist rozshiryuyutsya na misci Deyaki frejmvorki programuvannya taki yak AngularJS vikoristovuyut termin oblast shob oznachati shos zovsim inshe nizh zaznachene v cij statti U cih frejmvorkah oblast vidimosti ce lishe ob yekt movi programuvannya yaku voni vikoristovuyut JavaScript u vipadku AngularJS yakij pevnim chinom vikoristovuyetsya frejmvorkom dlya emulyaciyi dinamichnoyi oblasti vidimosti v movi yaka vikoristovuye leksichnu oblast vidimosti dlya svoyih zminnih Ci oblasti AngularJS mozhut sami buti v konteksti abo ne v konteksti vikoristovuyuchi zvichajne znachennya terminu u bud yakij chastini programi dotrimuyuchis zvichajnih pravil zminnoyi oblasti vidimosti movi yak i bud yakogo inshogo ob yekta i vikoristovuyuchi vlasne uspadkuvannya ta pravila vklyuchennya U konteksti AngularJS inodi vikoristovuyetsya termin scope zi znakom dolara shob uniknuti plutanini ale vikoristannya znaka dolara v imenah zminnih chasto ne rekomendovano posibnikami zi stilyu Riznovidi zminnih zalezhno vid mezh diyiU movah sho pidtrimuyut strukturne programuvannya zminni zazvichaj podilyayutsya na dva tipi zalezhno vid vidimosti lokalni zminni ogoloshuyutsya vseredini funkciyi i nedostupni poza neyu globalni zminni ogoloshuyutsya poza vsima funkciyami i dostupni zvidusil neavtoritetne dzherelo Ob yektno oriyentovane programuvannya peredbachaye isnuvannya vseredini kozhnogo klasu troh nariznih dilyanok z osoblivimi mezhami diyi Zakrita angl private mezhi diyi ogoloshen zbigayutsya z mezhami klasu posilatisya na zminni chi metodi mozhna lishe z kodu sho nalezhit klasovi Vidkrita angl public obmezhennya diyi vidsutnye ale posilatisya na zminni chi metodi mozhna lishe cherez im ya ob yekta primirnik klasu Zahishena angl protected mezhi diyi ogoloshen vidpovidayut mezham klasu ta vsih jogo nashadkiv Vikoristannya Oblast ye vazhlivim komponentom rozpiznavannya yakij u svoyu chergu ye fundamentalnim dlya semantiki movi Rozdilna zdatnist imen vklyuchayuchi oblast diyi riznitsya mizh movami programuvannya a v mezhah movi programuvannya zalezhit vid tipu sutnosti pravila dlya oblasti nazivayutsya pravilami oblasti abo pravilami viznachennya Razom iz prostorami imen pravila oblasti vidimosti ye virishalnimi v modulnomu programuvanni tomu zmina v odnij chastini programi ne porushuye nepov yazanu chastinu Oglyad Govoryachi pro obsyag isnuye tri osnovni ponyattya obsyag obsyag i kontekst Oblast ce vlastivist zv yazuvannya imeni todi yak kontekst ce vlastivist chastini programi yaka ye abo chastinoyu vihidnogo kodu leksichnim kontekstom chi statichnim kontekstom abo chastina vikonannya kontekst vikonannya kontekst vikliku abo dinamichnij kontekst Kontekst vikonannya skladayetsya z leksichnogo kontekstu u potochnij tochci vikonannya plyus dodatkovogo stanu vikonannya takogo yak stek viklikiv Strogo kazhuchi pid chas vikonannya programa vhodit i vihodit iz riznih oblastej priv yazki imen i v moment vikonannya priv yazki imen znahodyatsya v konteksti abo ne v konteksti otzhe priv yazki imen vhodyat u kontekst abo vihoditi z kontekstu koli vikonannya programi vhodit abo vihodit z oblasti vidimosti Odnak na praktici vikoristannya nabagato vilnishe Oblast ce koncepciya rivnya vihidnogo kodu ta vlastivist zv yazkiv imen zokrema zv yazkiv imen zminnih abo funkcij imena u vihidnomu kodi ye posilannyami na sutnosti v programi i ye chastinoyu povedinki kompilyatora chi interpretatora movi Takim chinom pitannya obsyagu podibni do vkazivnikiv yaki ye tipom posilan sho vikoristovuyutsya v programah bilsh zagalno Vikoristannya znachennya zminnoyi koli im ya znahoditsya v konteksti ale zminna neinicializovana analogichno rozimenuvannyu dostupu do znachennya zavislogo vkazivnika oskilki vin neviznachenij Odnak oskilki zminni ne znishuyutsya doki voni ne vijdut z kontekstu analoga zavislogo vkazivnika ne isnuye Dlya takih sutnostej yak zminni oblast diyi ce pidmnozhina chasu takozh vidoma yak extent im ya mozhe posilatisya lishe na zminnu yaka isnuye mozhlivo z neviznachenim znachennyam ale isnuyuchi zminni ne obov yazkovo ye vidimimi zminna mozhe isnuvati ale buti nedostupnim znachennya zberigayetsya ale ne posilayetsya v danomu konteksti abo dostupnim ale ne cherez zadane im ya u comu vipadku vono ne v konteksti programa poza mezhami imeni V inshih vipadkah trivalist zhittya ne maye znachennya mitka imenovana poziciya u vihidnomu kodi maye trivalist zhittya identichnu programi dlya statichno skompilovanih mov ale mozhe buti v konteksti chi ni v pevnij tochci programi a takozh dlya statichni zminni statichna globalna zminna znahoditsya v konteksti dlya vsiyeyi programi todi yak statichna lokalna zminna znahoditsya lishe v konteksti vseredini funkciyi abo inshogo lokalnogo kontekstu ale obidva mayut chas zhittya protyagom usogo vikonannya programi Viznachennya togo na yaku sutnist posilayetsya im ya vidome yak abo zokrema v ob yektno oriyentovanomu programuvanni i zalezhit vid movi Otrimavshi nazvu mova vlasne kompilyator abo interpretator pereviryaye vsi sutnosti yaki znahodyatsya v konteksti na vidpovidnist u razi neodnoznachnosti dvi sutnosti z odnakovoyu nazvoyu napriklad globalna ta lokalna zminna z odnakovoyu nazvoyu dlya yih rozriznennya vikoristovuyutsya pravila rozpiznavannya imen Najchastishe rozpiznavannya imen spirayetsya na pravilo vnutrishnogo kontekstu do zovnishnogo napriklad pravilo Python LEGB lokalne ohoplyuyuche globalne vbudovane imena neyavno rozv yazuyutsya u najvuzhchomu relevantnomu konteksti U deyakih vipadkah rozpiznavannya imen mozhe buti yavno viznacheno napriklad za dopomogoyu global i nonlocal klyuchovih sliv u Python v inshih vipadkah pravila za zamovchuvannyam ne mozhna zminiti Koli dvi identichni nazvi znahodyatsya v konteksti odnochasno posilayuchis na rizni sutnosti odne govorit pro te sho vidbuvayetsya koli im ya z vishim prioritetom zazvichaj najvnutrishnye maskuye im ya z nizhchim prioritetom Na rivni zminnih ce vidomo yak Cherez mozhlivist logichnih pomilok cherez maskuvannya deyaki movi zaboronyayut abo ne rekomenduyut maskuvati viklikayuchi pomilku abo poperedzhennya pid chas kompilyaciyi chi vikonannya Rizni movi programuvannya mayut rizni pravila oblasti vidimosti dlya riznih tipiv ogoloshen i imen Taki pravila oblasti vidimosti mayut velikij vpliv na semantiku movi i yak naslidok na povedinku ta korektnist program U takih movah yak C dostup do nezv yazanoyi zminnoyi ne maye chitko viznachenoyi semantiki ta mozhe prizvesti do neviznachenoyi povedinki podibnoyi do posilannya na zavislij vkazivnik i ogoloshennya abo imena sho vikoristovuyutsya poza yihnoyu oblastyu stvoryuvatimut sintaksichni pomilki Oblasti chasto priv yazani do inshih movnih konstrukcij i viznachayutsya neyavno ale bagato mov takozh proponuyut konstrukciyi specialno dlya keruvannya oblastyu Rivni oblasti Oblast mozhe variyuvatisya vid lishe odnogo virazu do vsiyeyi programi z bagatma mozhlivimi gradaciyami mizh nimi Najprostishim pravilom vidimosti ye globalna oblast vidimosti usi sutnosti vidimi v usij programi Najprostishim pravilom modulnoyi oblasti ye dvorivneva oblast z globalnoyu oblastyu v bud yakomu misci programi ta lokalnoyu oblastyu v mezhah funkciyi Bilsh skladne modulne programuvannya dopuskaye okremu oblast modulya de imena vidimi vseredini modulya privatni dlya modulya ale ne vidimi za jogo mezhami U mezhah funkciyi deyaki movi taki yak C dozvolyayut obmezhuvati oblast diyi bloku pidmnozhinoyu funkciyi inshi osoblivo funkcionalni movi dozvolyayut obmezhuvati oblast virazu odnim virazom Inshi oblasti vklyuchayut oblast vidimosti fajlu zokrema v C yaka povoditsya podibno do oblasti vidimosti modulya i blochnu oblast poza funkciyami osoblivo v Perl Problema polyagaye v tomu koli same pochinayetsya i zakinchuyetsya oblast U deyakih movah takih yak C oblast diyi imeni pochinayetsya z ogoloshennya imeni i tomu rizni imena ogolosheni v odnomu bloci mozhut mati rizni oblasti vidimosti Ce vimagaye ogoloshennya funkcij pered vikoristannyam hocha i ne obov yazkovo yih viznachennya i vimagaye poperednogo ogoloshennya v deyakih vipadkah zokrema dlya vzayemnoyi rekursiyi V inshih movah takih yak Python oblast imeni pochinayetsya na pochatku vidpovidnogo bloku de im ya ogolosheno napriklad pochatok funkciyi nezalezhno vid togo de vono viznacheno tomu vsi imena v mezhah danogo bloku mayut odnakovij obsyag U JavaScript oblast diyi imeni ogoloshenogo za dopomogoyu let abo const pochinayetsya z ogoloshennya imeni a oblast imeni ogoloshenogo za dopomogoyu var pochinayetsya z pochatku funkciyi de ogolosheno im ya sho vidomo yak pidjom zminnoyi Povedinka imen u konteksti yaki mayut neviznachene znachennya vidriznyayetsya u Python vikoristannya neviznachenih imen prizvodit do pomilki vikonannya todi yak u JavaScript neviznacheni imena ogolosheni za dopomogoyu var mozhna vikoristovuvati u vsij funkciyi oskilki voni neyavno priv yazani do znachennya undefined Oblast virazu Obsyag priv yazki imeni ce viraz yakij vidomij yak oblast virazu Oblast virazu dostupna v bagatoh movah osoblivo u funkcionalnih movah yaki proponuyut funkciyu pid nazvoyu let virazi sho dozvolyaye oblasti ogoloshennya buti odnim virazom Ce zruchno yaksho napriklad dlya obchislennya potribne promizhne znachennya Napriklad u Standard ML yaksho f povertaye 12 todi b let val b x f b in b x x b end b ye virazom yakij obchislyuyetsya yak 144 vikoristovuyuchi timchasovu zminnu z imenem x shob uniknuti podvijnogo vikliku f Deyaki movi z blochnoyu oblastyu nablizhayut cyu funkcionalnist proponuyuchi sintaksis dlya bloku yakij bude vbudovano u viraz napriklad vishezgadanij standartnij viraz ML mozhna zapisati na Perl yak span class k do span span class w span span class p span span class w span span class k my span span class w span span class nv x span span class w span span class o span span class w span span class n f span span class p span span class w span span class nv x span span class w span span class o span span class w span span class nv x span span class w span span class p span abo v GNU C yak span class p span span class w span span class kt int span span class w span span class n x span span class w span span class o span span class w span span class n f span span class p span span class w span span class n x span span class w span span class o span span class w span span class n x span span class p span span class w span span class p span U Python dopomizhni zminni u virazah generatora ta rozuminnya spiskiv u Python 3 mayut oblast virazu U C imena zminnih u prototipi funkciyi mayut oblast virazu vidomu v comu konteksti yak oblast protokolu funkciyi Oskilki nazvi zminnih u prototipi ne zgaduyutsya voni mozhut vidriznyatisya u faktichnomu viznachenni voni ye prosto fiktivnimi yih chasto opuskayut hocha voni mozhut vikoristovuvatisya napriklad dlya stvorennya dokumentaciyi Oblast bloku Obsyag priv yazki imeni ce blok yakij vidomij yak oblast bloku Blokova oblast dostupna v bagatoh ale ne u vsih movah programuvannya z blochnoyu strukturoyu Ce pochalosya z de kozhna deklaraciya dijsna lishe dlya cogo bloku i sogodni ce osoblivo pov yazano z movami simejstv i tradicij Pascal i C Najchastishe cej blok mistitsya u funkciyi takim chinom obmezhuyuchi oblast vidimosti chastinoyu funkciyi ale v deyakih vipadkah napriklad u Perl blok mozhe buti ne vseredini funkciyi unsigned int sum of squares const unsigned int N unsigned int ret 0 for unsigned int n 1 n lt N n const unsigned int n squared n n ret n squared return ret Yaskravim prikladom vikoristannya oblasti vidimosti bloku ye navedenij tut kod C de dvi zminni obmezheni ciklom zminna ciklu n yaka inicializuyetsya odin raz i zbilshuyetsya na kozhnij iteraciyi ciklu i dopomizhna zminna n squared yaka inicializuyetsya na kozhnij iteraciyi Meta polyagaye v tomu shob uniknuti dodavannya zminnih do oblasti vidimosti funkciyi yaki mayut vidnoshennya lishe do pevnogo bloku napriklad ce zapobigaye pomilkam koli zagalna zminna ciklu i vzhe bula vipadkovo vstanovlena na inshe znachennya U comu prikladi viraz n n yak pravilo ne bude priznacheno dopomizhnij zminnij a tilo ciklu bude prosto napisano ret n n ale v bilsh skladnih prikladah dopomizhni zminni ye korisnimi Bloki v osnovnomu vikoristovuyutsya dlya potoku keruvannya napriklad iz ciklami if while i for i v cih vipadkah oblast diyi bloku oznachaye sho oblast diyi zminnoyi zalezhit vid strukturi potoku vikonannya funkciyi Odnak movi z blochnoyu oblastyu zazvichaj takozh dozvolyayut vikoristovuvati goli bloki yedinoyu metoyu yakih ye mozhlivist detalnogo keruvannya zminnoyu oblastyu Napriklad dopomizhna zminna mozhe buti viznachena v bloci potim vikoristana skazhimo dodana do zminnoyi z oblastyu diyi funkciyi i vidkinuta koli blok zakinchuyetsya abo cikl while mozhe buti ukladenij u blok yakij inicializuye zminni sho vikoristovuyutsya vseredini ciklu yakij slid inicializuvati lishe odin raz Tonkist kilkoh mov programuvannya takih yak i C prodemonstrovana v comu prikladi ta standartizovana z C99 polyagaye v tomu sho zminni oblasti vidimosti bloku mozhut buti ogolosheni ne lishe v tili bloku ale takozh i v operatori keruvannya yaksho bud yakij Ce analogichno parametram funkciyi yaki ogoloshuyutsya v deklaraciyi funkciyi pered pochatkom bloku tila funkciyi i v oblasti vidimosti dlya vsogo tila funkciyi Ce v osnovnomu vikoristovuyetsya v ciklah for yaki mayut operator inicializaciyi okremij vid umovi ciklu na vidminu vid cikliv while i ye zagalnoyu idiomoyu Oblast bloku mozhna vikoristovuvati dlya zatinennya U comu prikladi vseredini bloku dopomizhnu zminnu takozh mozhna bulo b nazvati n zatinyayuchi im ya parametra ale ce vvazhayetsya poganim stilem cherez mozhlivist pomilok Krim togo deyaki nashadki C taki yak Java i C nezvazhayuchi na pidtrimku oblasti vidimosti bloku tobto lokalnu zminnu mozhna vivesti z kontekstu do zavershennya funkciyi ne dozvolyayut odnij lokalnij zminnij prihovuvati inshu U takih movah sproba ogoloshennya drugogo n prizvela b do sintaksichnoyi pomilki i odnu z n zminnih potribno bulo b perejmenuvati Yaksho blok vikoristovuyetsya dlya vstanovlennya znachennya zminnoyi oblast diyi bloku vimagaye shob zminna bula ogoloshena poza blokom Ce uskladnyuye vikoristannya umovnih operatoriv z odnim priznachennyam Napriklad u Python yakij ne vikoristovuye blokovu oblast mozhna inicializuvati zminnu yak taku if c a foo else a de a dostupnij pislya operatora if U Perl yakij maye blochnu oblast zamist cogo potribno ogolositi zminnu pered blokom my a if c a foo else a Chasto zamist cogo ce perepisuyetsya za dopomogoyu mnozhinnogo priznachennya inicializuyuchi zminnu znachennyam za zamovchuvannyam U Python de ce ne potribno ce bude a if c a foo todi yak u Perl ce bude my a if c a foo U vipadku priznachennya odniyeyi zminnoyi alternativoyu ye vikoristannya ternarnogo operatora shob uniknuti blokuvannya ale ce yak pravilo nemozhlivo dlya priznachennya kilkoh zminnih i jogo vazhko prochitati dlya skladnoyi logiki Ce bilsh suttyeva problema v C osoblivo dlya priznachennya ryadka oskilki inicializaciya ryadka mozhe avtomatichno vidilyati pam yat todi yak priznachennya ryadka vzhe inicializovanij zminnij vimagaye vidilennya pam yati kopiyi ryadka ta perevirki yih uspishnosti my counter 0 sub increment counter return counter Deyaki movi dozvolyayut zastosovuvati koncepciyu oblasti vidimosti bloku v riznomu stupeni poza funkciyeyu Napriklad u fragmenti Perl pravoruch counter ce im ya zminnoyi z blochnoyu oblastyu cherez vikoristannya klyuchovogo slova my todi yak increment counter ce im ya funkciyi z globalnoyu oblastyu vidimosti Kozhen viklik increment counter zbilshit znachennya counter na odinicyu ta poverne nove znachennya Kod za mezhami cogo bloku mozhe viklikati increment counter ale ne mozhe inakshe otrimati abo zminiti znachennya counter Cya idioma dozvolyaye viznachati zakrittya v Perl Oblast funkciyi Koli oblast zminnih ogoloshenih u funkciyi ne vihodit za mezhi ciyeyi funkciyi ce nazivayetsya oblastyu vidimosti funkciyi Oblast vidimosti funkciyi dostupna v bilshosti mov programuvannya yaki proponuyut sposib stvorennya lokalnoyi zminnoyi u funkciyi abo pidprogrami zminnoyi oblast diyi yakoyi zakinchuyetsya sho vihodit z kontekstu koli funkciya povertayetsya U bilshosti vipadkiv chas zhittya zminnoyi dorivnyuye trivalosti vikliku funkciyi ce stvorena pid chas zapusku funkciyi abo zminna ogoloshena znishena koli funkciya povertayetsya todi yak oblast vidimosti zminnoyi znahoditsya v mezhah funkciya hocha znachennya vseredini zalezhit vid togo chi ye oblast leksichnoyu chi dinamichnoyu Odnak deyaki movi taki yak C takozh peredbachayut statichni lokalni zminni de chas zhittya zminnoyi dorivnyuye vsomu chasu zhittya programi ale zminna znahoditsya v konteksti lishe vseredini funkciyi U vipadku statichnih lokalnih zminnih zminna stvoryuyetsya pid chas inicializaciyi programi ta znishuyetsya lishe todi koli programa zavershuyetsya yak u vipadku zi statichnoyu globalnoyu zminnoyu ale znahoditsya lishe v konteksti funkciyi yak avtomatichna lokalna zminna Vazhlivo sho v leksichnij oblasti vidimosti zminna z oblastyu vidimosti funkciyi maye oblast vidimosti lishe v mezhah leksichnogo kontekstu funkciyi vona vihodit iz kontekstu koli insha funkciya viklikayetsya v mezhah funkciyi i povertayetsya v kontekst koli funkciya povertayetsya viklikani funkciyi ne mayut dostupu do lokalnih zminnih funkcij sho viklikayut i lokalni zminni znahodyatsya lishe v konteksti vseredini tila funkciyi v yakij voni ogolosheni Navpaki u dinamichnij oblasti vidimosti oblast poshiryuyetsya na kontekst vikonannya funkciyi lokalni zminni zalishayutsya v konteksti koli viklikayetsya insha funkciya vihodyachi z kontekstu lishe pislya zavershennya funkciyi sho viznachaye i takim chinom lokalni zminni znahodyatsya v konteksti funkciyi v yakomu voni viznacheni ta vsi nazivayutsya funkciyami U movah z leksichnim obsyagom i vkladenimi funkciyami lokalni zminni znahodyatsya v konteksti dlya vkladenih funkcij oskilki voni znahodyatsya v tomu samomu leksichnomu konteksti ale ne dlya inshih funkcij yaki ne ye leksichno vkladenimi Lokalna zminna ohoplyuyuchoyi funkciyi vidoma yak dlya vkladenoyi funkciyi Oblast diyi funkciyi takozh zastosovna do anonimnih funkcij def square n return n n def sum of squares n total 0 i 0 while i lt n total square i i 1 return total Napriklad u fragmenti kodu Python pravoruch viznacheno dvi funkciyi square i sum of squares square obchislyuye kvadrat chisla sum of squares obchislyuye sumu vsih kvadrativ do chisla Napriklad square 4 dorivnyuye 4 2 16 a sum of squares 4 dorivnyuye 0 2 1 2 2 2 3 2 4 2 30 Kozhna z cih funkcij maye zminnu z imenem n yaka predstavlyaye argument funkciyi Ci dvi n zminnih povnistyu okremi ta ne pov yazani nezvazhayuchi na te same im ya tomu sho voni ye lokalnimi zminnimi z leksichnoyu oblastyu vidimosti z oblastyu vidimosti funkciyi oblast vidimosti kozhnoyi z nih ye okremoyu leksichno okremoyu funkciyeyu i tomu voni ne zbigayutsya Takim chinom sum of squares mozhe viklikati square bez zmini vlasnogo n Tak samo sum of squares maye zminni z imenami total ta i ci zminni cherez yih obmezhenij obsyag ne zavazhatimut bud yakim zminnim z imenem total abo i yaki mozhut nalezhati do bud yakoyi inshoyi funkciyi Inshimi slovami nemaye riziku zitknennya imen mizh cimi imenami ta bud yakimi nepov yazanimi imenami navit yaksho voni identichni Niyakogo maskuvannya imen ne vidbuvayetsya lishe odna zminna z imenem n znahoditsya v konteksti v bud yakij moment chasu oskilki oblasti ne perekrivayutsya Navpaki yakbi podibnij fragment buv napisanij movoyu z dinamichnoyu oblastyu vidimosti n u funkciyi sho viklikaye zalishavsya b u konteksti viklikanoyi funkciyi oblasti vidimosti perekrivalisya b i buli b zamaskovani zatineni novim n u viklikanij funkciyi Oblast diyi funkciyi znachno uskladnyuyetsya yaksho funkciyi ye ob yektami pershogo klasu i mozhut buti stvoreni lokalno dlya funkciyi a potim povernuti U comu vipadku bud yaki zminni u vkladenij funkciyi yaki ne ye lokalnimi dlya neyi nezv yazani zminni u viznachenni funkciyi yaki peretvoryuyutsya na zminni v ohoplyuyuchomu konteksti stvoryuyut zakrittya oskilki ne lishe sama funkciya ale j yiyi kontekst zminnih potribno povernuti a potim potencijno viklikati v inshomu konteksti Ce vimagaye znachno bilshoyi pidtrimki vid kompilyatora ta mozhe uskladniti analiz programi Movi rozmitkiPonyattya mezh diyi takozh stosuyetsya mov rozmitki Napriklad v HTML mezhi diyi imeni polya vvedennya te same stosuyetsya praporciv gudzikiv tosho zbigayutsya z mezhami formi HTML vid lt form gt do lt form gt PrikladiC Priklad oblastej vidimosti zminnih u movi programuvannya C Zminna foo maye globalni mezhi diyi int foo 0 int main Mezhami diyi zminnoyi bar ye tilo funkciyi main int bar 1 include lt stdio h gt int a 0 Globalna zminna int main printf d a Bude vivedeno chislo 0 int a 1 Ogoloshena lokalna zminna a globalnu zminnu a ne vidno printf d a Bude vivedeno chislo 1 int a 2 She lokalna zminna v bloci globalnu zminnu a ne vidno nevidno i poperednyu lokalnu zminnu printf d a Bude vivedeno chislo 2 Primitki Report on the Algorithmic Language Algol 60 2 7 Quantities kinds and scopes WG14 N1256 2007 updated version of the C99 standard 6 2 1 Scopes of identifiers 2007 09 07 The Go Programming Language Specification Declarations and scope Version of Nov 13 2013 Borning A University of Washington Crockford Douglas Code Conventions for the JavaScript Programming Language Procitovano 4 sichnya 2015 UROK 12 lokalni zminni I OBLAST VIDIMOSTI Arhiv originalu za 16 bereznya 2013 Procitovano 11 bereznya 2013 Oblasti vidimosti Arhiv originalu za 16 bereznya 2013 Procitovano 11 bereznya 2013 Backus J W Wegstein J H Van Wijngaarden A Woodger M Bauer F L Green J Katz C McCarthy J Perlis A J 1960 Report on the algorithmic language ALGOL 60 Communications of the ACM 3 5 299 doi 10 1145 367236 367262 Functions Javascript MDN Variables defined inside a function cannot be accessed from anywhere outside the function because the variable is defined only in the scope of the function However a function can access all variables and functions defined inside the scope in which it is defined Specifikaciya movi HTML ros Pereklad A Piramidin ISBN 978 5 94774 648 8 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Proignorovano website dovidka KomentariSee definition for meaning of scope versus context Dynamic scope bases name resolution on extent lifetime not scope and thus is formally inaccurate For example the template engine for Python by default uses both lexical scope for imports and dynamic scope for includes and allows behavior to be specified with keywords see Import Context Behavior Name resolution and name binding are largely synonymous narrowly speaking resolution determines to which name a particular use of a name refers without associating it with any meaning as in while binding associates the name with an actual meaning In practice the terms are used interchangeably For the lexical context itself can change during run time By contrast a name binding s context a name binding coming into scope or a name binding going out of scope are all incorrect a name binding has scope while a part of a program has context V inshomu movnomu rozdili ye povnisha stattya Scope computer science angl Vi mozhete dopomogti rozshirivshi potochnu stattyu za dopomogoyu perekladu z anglijskoyi lyutij 2022 Divitis avtoperekladenu versiyu statti z movi anglijska Perekladach povinen rozumiti sho vidpovidalnist za kincevij vmist statti u Vikipediyi nese same avtor redaguvan Onlajn pereklad nadayetsya lishe yak korisnij instrument pereglyadu vmistu zrozumiloyu movoyu Ne vikoristovujte nevichitanij i nevidkorigovanij mashinnij pereklad u stattyah ukrayinskoyi Vikipediyi Mashinnij pereklad Google ye korisnoyu vidpravnoyu tochkoyu dlya perekladu ale perekladacham neobhidno vipravlyati pomilki ta pidtverdzhuvati tochnist perekladu a ne prosto skopiyuvati mashinnij pereklad do ukrayinskoyi Vikipediyi Ne perekladajte tekst yakij vidayetsya nedostovirnim abo neyakisnim Yaksho mozhlivo perevirte tekst za posilannyami podanimi v inshomovnij statti Dokladni rekomendaciyi div Vikipediya Pereklad Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi