Меню сайта |
|
|
Категории раздела |
|
|
Поиск |
|
|
|
Область видимости
В AutoIt3 существуют две области видимости: глобальная и локальная. 1. Глобальная область видимости - всё то что вне функции 2. Локальная область видимости - принудительно объявленные локально переменные внутри функции
Всё что мы объявляем вне функции объявляются глобально вне зависимости от того, какое ключевое слово вы используете, будь то Global, Local, Dim или вообще без них, последнее возможно только с присвоением данных (кроме массива, массив объявляется только с ключевым словом). Объявление переменных внутри функции немного сложнее. Параметры переданные в функцию автоматически являются принудительно локальными и изменить этого нельзя. Аналогично при использовании Local. Как это работает? Обработчик скрипта приоритетно просматривает переменные созданные в локальной области видимости и если не находит там переменную, то просматривает её в глобальной области видимости. Очевидно, что если обработчик скрипта найдёт имя переменной в локальной области видимости, то он уже не будет просматривать глобальную область видимости.
Допустим вы назначаете переменной внутри функции некое значение впервые без ключевого слова. Обработчик проверит область видимости переменной и соответственно изменит значение той переменной, которую он найдёт первой, опять же просмотрит в локальной области и далее в глобальной. Если не найдёт совсем, то объявит её в локальной области видимости. По правилам программирования это допустимо, но не является хорошим тоном в программированием, так как любое случайное совпадение имён с глобальной областью видимости приведёт к возможности порчи данных. То есть область видимости любой переменной должна быть чётко определена. Для локальных внутри функции они должны быть обязательно объявлены с ключевым словом Local. Это поможет функции быть независимой / изолированной от внешних переменных и стабильно работать внутри любого скрипта. Переменная, объявленная внутри функции с помощью Local НИКОГДА не будет просматриваться в глобальной области, это как бы свой мир внутри функции, в котором связь с внешним миром только через переданные параметры и возвращаемое значение.
ByRef Как было сказано выше переданные в функцию переменные автоматически являются принудительно локальными и изменить это нельзя, а повторное объявление вызывает ошибку. Переданные параметры к тому же копируются внутрь функции или как бы объявляются заново локальными с присвоением им данных, которые имели переменные в точке вызова этой функции. Чтобы не копировать переменные и не возвращать результаты (ещё раз копируя) в ту же самую переменную, а работать непосредственно с переменной для этого используется ключевое слово ByRef. Это английское сокращение от "by reference" - по ссылке. Более точное определение в программировании "указатель". То есть в функцию передаётся указатель на данные. Если переданная переменная является глобальной, то хоть и внутри функции эта переменная является локальной, она всё же фактически меняет глобальную переменную. Другими словами это одна ячейка памяти данных имеющая два имени переменной в глобальной и локальной областях видимости. Естественно запись данных меняет их для обоих имён переменных. Чем полезен такой подход? Во первых избавляет от затрат времени на копирование данных с целью создания независимой переменной и второе копирование для возвращения данных. Во вторых при дублировании может затрачиваться двукратное количество памяти, а при рекурсии и подавно многократное дублирование. В третьих при возвращении из функции можно возвратить только один элемент данных, а передав несколько параметров с ByRef они будут все обновлены. Конечно можно возвратить массив данных, но не будет той простоты.
Dim Использовать ключевое слово Dim для объявления переменных бессмысленно, а при повторном объявлении позволяет пересоздать массив. Если переменная была объявлена локально, то Dim пересоздаст массив в локальной области, а если переменная была объявлена глобально, то Dim пересоздаст массив в глобальной области. То есть Dim как бы позволяет обработчику скрипта определить, с какой переменной он будет работать, опять же по приоритету поиска переменных. Не рекомендуется для новичков использовать Dim, так как в 99% он не нужен и его все ошибочно используют не по назначению, по привычке видя чужой, не всегда правильный код.
Static Ключевое слово Static - это не определяет область видимости, но определяет поведение переменной. Static используется всегда внутри функции, снаружи просто бессмысленно. Внутри функции, если объявление происходит с присвоением, то это присвоение выполняется только при первом вызове функции. При последующем вызове функции переменная будет содержать в себе значение, которое осталось в ней в конце предыдущего вызова функции. То есть это как бы локальная переменная, которая имеет остаточный эффект сохранения. Все локальные переменные функции умирают при выходе из функции, а переменная объявленная со Static остаётся жить до следующего вызова и при этом хранит в себе данные. Она также не видна другим функциям, но видна только той функции. в которой она объявлена. Если бы не было Static, то пришлось бы создавать глобальную переменную для постоянного хранения остаточных результатов, а UDF как известно характеризуется положительно при наименьшем количестве глобальных переменных.
Const Ключевое слово Const - это не определяет область видимости, но определяет поведение переменной. Казалось бы всё с ней ясно, константа говорит сама за себя. Попытка изменения константы вызывает ошибку скрипта с завершением выполнения независимо закончил ли выполнятся задуманный алгоритм. Теоретически зная назначение переменной мы заведомо не собираемся её менять, а уж если считать, что это может произойти в результате опечатки или ошибки, ну тогда можно считать что мы и не в состоянии написать алгоритм, если допускаем возможность вне своего сознания нарушать логику алгоритма. То есть ближе к делу, константа больше предназначена не столько, чтобы избавить себя от ошибки её изменения, сколько то, что её явное указание показывает программисту о назначении этих данных. Хотя при использовании чужого кода это позволит защитить свой блок/модуль от влияния извне, но принятое по негласным правилам использование верхнего регистра для констант автоматически сигнализирует программисту о том, что данная переменная является константой. Константой можно объявить математические константы, или именованные битовые флаги, которые задают функциям их поведение. |
Категория: Примеры скриптов | Добавил: AZJIO (22.12.2013)
|
Просмотров: 2128
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|
Вход |
|
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
ЮMoney |
Мой кошелёк
ЮMoney: 4100117604217624
|
|
|