Это не утверждения, это рассуждения в попытке разобраться.
Object1 := {Property1: 42, Property2: 23}
ListVars
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
Sleep, 2000
MyFunc(Object1)
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
ListVars
Return
MyFunc(x)
{
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
x := {Property1: 200, Property2: 300}
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
}
1.1 Если без ByRef, то в локальный объект x попадают адреса Object1. Это говорит о том, что переданная "ксерокопия" ссылается на те же "полки", что и оригинал. При выполнении x := {Property1: 200, Property2: 300} адреса ("полки") для локального объекта x изменяются. По завершению работы функции видим, что в глобальном Object1 изменений не произошло.
1.2 С ByRef в глобальном Object1 изменения происходят. Только просмотреть ListVars не получается - программа вылетает с ошибкой. Но если ListVars закомментировать, то по ToolTip видно, что Object1 после работы функции изменился. Из чего я делаю вывод, что с ByRef локальный объект x ссылается на то же содержимое памяти, что и Object1.
Какие выводы...
Я был неправ насчёт полной копии; при вызове функции копируется только каталожная часть объекта (она же ссылка, она же переменная, она же указатель (pointer) или "обращение (handle)").
В п. 1.1 нет копии объекта, есть только копия его каталожной части. Поскольку в широком смысле объект = каталожная часть + данные.
В п. 1.2 глобальных объект изменится при выполнении x := {Property1: 200, Property2: 300}, а не по завершению работы функции.
Что я сказал не так про локальные ксерокопии?
Во втором примере тоже не понял, где я ошибаюсь по части в функцию передаётся оригинальный "каталог".
Object1 := {Property1: 42, Property2: 23}
ListVars
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
Sleep, 2000
MyFunc(Object1)
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
ListVars
Return
MyFunc(x) {
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
x["Property1"] := 200, x["Property2"] := 300
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
}