Я считаю, что @Constantiner находится на правильном пути, но я думаю, что в его объяснении отсутствуют детали; поэтому я попытаюсь объяснить немного глубже; как я понимаю. Я могу исправить меня, если я ошибаюсь.
Как указано в документах :
В ActionScript 3.0 все аргументы
передается по ссылке, потому что все
значения хранятся в виде объектов. Тем не мение,
объекты, которые принадлежат к примитиву
типы данных, в том числе логические,
Число, int, uint и String имеют
специальные операторы, которые делают их
вести себя так, как будто они прошли мимо
значение.
Итак, ArrayCollection определенно является объектом, а не примитивным типом, поэтому его следует передавать по ссылке и действовать так, как если бы он передавался по ссылке. Но какова ваша ссылочная переменная для ArrayCollection. Концептуально это просто указатель на некоторое пространство памяти, которое содержит фактические данные коллекции. Вот моя попытка в некотором искусстве ASCII:
|---|
ac1(variable)--> | | (ActualArrayCollection1)
|---|
|---|
ac2(variable)--> | | (ActualArrayCollection2)
|---|
повторюсь, переменная ac1variable является указателем на некоторое пространство памяти. переменная ac2variable является указателем на другое пространство памяти. Когда вы передаете один из них в метод в качестве аргумента, он передается по ссылке. Итак, внутри метода у вас есть что-то вроде этого:
ac1(variable)--> |---|
ac1(argument)--> | | (ActualArrayCollection1)
|---|
ac2(variable)--> |---|
ac2(argument)--> | | (ActualArrayCollection2)
|---|
Таким образом, переменная ac1variable и ac1argument указывают на одно и то же пространство памяти; потому что каждый из них содержит одно и то же значение указателя. Тем не менее, ac1variable и ac1argument фактически содержат разные области памяти. Они не то же самое.
Когда метод запускает эту строку:
_ac2 = _ac1;
Вы получите что-то вроде этого:
ac1(variable)--> |---|
ac1(argument)--> | | (ActualArrayCollection1)
ac2(argument)--> |---|
ac2(variable)--> |---|
| | (ActualArrayCollection2)
|---|
Когда выполнение метода заканчивается, два аргумента исчезают, а исходные переменные-указатели остаются неизменными. Если вы хотите сделать прямое присвоение, подобное этому, внутри метода, вы можете получить доступ к глобальной переменной, используя ключевое слово this. Это должно сделать это:
this._ac2 = _ac1;
Конечно, это может нанести ущерб цели инкапсуляции внутри метода, если вы обращаетесь к переменным уровня класса.
Я уверен, что эксперт по проектированию компиляторов и тому подобное съест это на завтрак и выплюнет. Я надеюсь, что мой ASCII-арт одинаков для разных браузеров / машин / ОС / и т. Д.