Difference between revisions of "Границы видимости переменных"
(Created page with "Переменная на встроенном языке системы никогда не является глобальной. Для каждой переменной с...") |
m (1 revision imported) |
(No difference)
|
Latest revision as of 07:54, 7 February 2021
Переменная на встроенном языке системы никогда не является глобальной. Для каждой переменной существуют границы существования и видимости, причем, границы видимости могут быть расширены на вложенные функции. Ниже дается краткое описание для каждого из этих понятий.
Переменная всегда создается внутри какой-либо функции (новый модуль в общем смысле также является такой функцией) и будет автоматически удалена из системы (и хранящийся в ней объект также будет удален) в момент, когда функция завершит работу. Переменные, созданные в глобальных модулях, удаляются только при завершении работы клиента, так как глобальные модули всегда находятся в памяти, а их функции всегда доступны для вызова. Если функция выполняется рекурсивно, переменные создаются заново для каждого вызова функции, и удаляются после его завершения.
Переменные, созданные внутри функции обычно доступны только внутри этой функции, при вызове из нее других функций, переменные текущей функции не будут доступны в них. Если функция выполняется рекурсивно, переменные создаются заново для каждого вызова функции, программа будет иметь доступ к новым копиям переменных, а переменные предыдущих итераций функции будут доступны только при завершении текущей итерации. Таким образов в стеке может быть множество переменных с одинаковым именем, созданных в функциях разной глубины вложенности, доступных только на своем уровне вложенности. Это поведение, однако, можно изменить. Если переменная создается внутри функции с постфиксом Export
(для задания переменной в этом случае, необходимо использовать оператор Var
), она будет доступна внутри всех функций, вложенный в данную. Таким образом удобно задавать переменные, расширенной доступности, в начале модуля и все вызванные функции внутри модуля будут иметь доступ к этим переменным, если же переменные задаются внутри глобального модуля, они доступны в любых вложенных модулях и их функциях. Также нужно понимать, что особенные переменные (создаваемые системой при вызове модулей Result, либо при вызове визуальных событий), а также аргументы функций автоматически получают флаг расширенной видимости.
Ниже предлагаются примеры для демонстрации границ видимости:
//Пример недоступности переменных Function xyz() //Переменная c недоступна в этой функции (компиляция будет остановлена с ошибкой) Message(c); EndFunction Function abc() c:=1; Function xyz2() //Переменная c недоступна в этой функции (компиляция выполнится успешно, исполнение завершится с ошибкой) Message(c); EndFunction xyz(); xyz2(); EndFunction abc();
//Предыдущий пример, когда переменная c доступна Function xyz() //Переменная c не может быть доступна в этой функции //Message(c); EndFunction Function abc() var c export; c:=1; Function xyz2() //Переменная c доступна, так как она задана с постфиксом Export Message(c); EndFunction xyz(); xyz2(); EndFunction abc();