Область действия определяет область, в которой доступны функции, переменные и тому подобное. Например, доступность переменной определяется в ее контексте, скажем, в функции, файле или объекте, в котором они определены. Мы обычно называем эти локальные переменные.
Лексическая часть означает, что вы можете извлечь область из чтения исходного кода.
Лексическая область видимости также называется статической областью действия.
Динамическая область действия определяет глобальные переменные, которые можно вызывать или ссылаться из любого места после их определения. Иногда их называют глобальными переменными, хотя глобальные переменные в большинстве языков программирования имеют лексическую область. Это означает, что из чтения кода можно получить информацию о том, что переменная доступна в этом контексте. Может быть, нужно следовать условию использования или включения, чтобы найти указание или определение, но код / компилятор знает о переменной в этом месте.
Напротив, в динамическом определении объема вы сначала выполняете поиск в локальной функции, затем - в функции, которая вызвала локальную функцию, затем - в функции, которая вызвала эту функцию, и так далее, вверх по стеку вызовов. «Динамический» относится к изменению в том смысле, что стек вызовов может отличаться каждый раз, когда вызывается данная функция, и поэтому функция может попадать в разные переменные в зависимости от того, откуда она вызывается. (см. здесь )
Чтобы увидеть интересный пример динамической области действия, см. здесь .
Подробнее см. здесь и здесь .
Некоторые примеры в Delphi / Object Pascal
Delphi имеет лексическую область видимости.
unit Main;
uses aUnit; // makes available all variables in interface section of aUnit
interface
var aGlobal: string; // global in the scope of all units that use Main;
type
TmyClass = class
strict private aPrivateVar: Integer; // only known by objects of this class type
// lexical: within class definition,
// reserved word private
public aPublicVar: double; // known to everyboday that has access to a
// object of this class type
end;
implementation
var aLocalGlobal: string; // known to all functions following
// the definition in this unit
end.
Ближайший Delphi к динамической области видимости - это пара функций RegisterClass () / GetClass (). О его использовании см. здесь .
Допустим, время, когда RegisterClass ([TmyClass]) вызывается для регистрации определенного класса, нельзя предсказать, прочитав код (он вызывается в методе нажатия кнопки, вызываемом пользователем), код, вызывающий GetClass ('TmyClass' ) получит результат или нет. Вызов RegisterClass () не обязательно должен быть в лексической области модуля, использующего GetClass ();
Другая возможность для динамической области видимости - это анонимные методы (замыкания) в Delphi 2009, поскольку они знают переменные своей вызывающей функции. Он не следует рекурсивному пути вызова и поэтому не является полностью динамическим.