Границы видимости переменных

From SunFlurry wiki
Jump to: navigation, search

Переменная на встроенном языке системы никогда не является глобальной. Для каждой переменной существуют границы существования и видимости, причем, границы видимости могут быть расширены на вложенные функции. Ниже дается краткое описание для каждого из этих понятий.

Переменная всегда создается внутри какой-либо функции (новый модуль в общем смысле также является такой функцией) и будет автоматически удалена из системы (и хранящийся в ней объект также будет удален) в момент, когда функция завершит работу. Переменные, созданные в глобальных модулях, удаляются только при завершении работы клиента, так как глобальные модули всегда находятся в памяти, а их функции всегда доступны для вызова. Если функция выполняется рекурсивно, переменные создаются заново для каждого вызова функции, и удаляются после его завершения.

Переменные, созданные внутри функции обычно доступны только внутри этой функции, при вызове из нее других функций, переменные текущей функции не будут доступны в них. Если функция выполняется рекурсивно, переменные создаются заново для каждого вызова функции, программа будет иметь доступ к новым копиям переменных, а переменные предыдущих итераций функции будут доступны только при завершении текущей итерации. Таким образов в стеке может быть множество переменных с одинаковым именем, созданных в функциях разной глубины вложенности, доступных только на своем уровне вложенности. Это поведение, однако, можно изменить. Если переменная создается внутри функции с постфиксом 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();