Если не указано ByRef, то при вызове функции из стека выделяется блок памяти нужного размера, в который копируются данные, соответствующие передаваемой переменной. Внутри же функции адресация происходит на этот блок памяти. Технически, все передаваемые в функцию данные без ByRef ничем не отличаются от локальных данных с предварительной инициализацией, объявленных внутри самой функции. Перед завершением функции вся выделенная память автоматически освобождается, благодаря чему нет необходимости заниматься этим самостоятельно. Например, можно не уничтожать структуры, которые были созданы внутри функции.
Если указано ByRef, то при вызове функции никакой дополнительной памяти для этих данных выделено не будет, а адресация будет происходить непосредственно на "оригинальные" данные. Вследствии чего любые изменения, сделанные внутри функции, отразятся на самих данных. Во избежании случайного изменения данных можно перед ByRef указать Const (Const ByRef). В этом случае AutoIt выдаст ошибку при первой же попытке изменить данные. Если используется ByRef, то соответствующая переменная должна быть объявлена до вызова функции.
ByRef используется в следующих ситуациях:
1. Функция возвращает более одного параметра.
2. Передача и возврат данных посредством одной переменной.
3. Передача в функцию объемных данных (массивов), чтобы избежать потери времени на их копирование при вызове функции. Особенно актуально, когда функция вызывается многократно, например в цикле. В этом случае целесообразно использовать Const ByRef.
Некоторые типы данных, такие как объекты или структуры, всегда передаются посредством указателей читай ByRef, поэтому явное указание ByRef для таки переменных не имеет смысла.