Ответ 1
См. Стратегия оценки.
AS использует "pass by object" / "pass by object-sharing" . То есть "объект" передается (не копия, клон или дубликат), и любые изменения в объекте являются общими.
Однако назначение _ac2 = _ac1
изменяет только значение переменной параметра [function local] и не будет влиять на какие-либо переменные во время вызова функции. Единственное, что прошло, это значения ( "объекты" ), которые являются результатом оценки переменных (или любого произвольного выражения), используемых в вызове функции.
Это связано с тем, что, как указано выше, используемая стратегия - это "передать по объекту" , а не (поскольку в документации указано "передать по ссылке" , что на самом деле означает "передать по значению [ ссылка]" или просто... "передать по объекту" ). То есть термин "передать по ссылке" фактически используется неправильно и, следовательно, запутывает. (Он используется неправильно на нескольких языках и документации. Это тяжелая битва, пытающаяся достичь общего смысла.)
Если бы это было действительно "передать по ссылке" , то присвоение нового значения _ac2
будет распространяться. (Прежде чем писать комментарий о том, как AS "передается по ссылке", см. Ссылку вверху и считайте, что "передать по ссылке" охватывает случай С# out/ref
, VB ByRef
, TSQL output
и С++ ( reference) &
- эти понятия не относятся к AS, Javascript или Java). Однако, как правильно отмечено в исходном сообщении (и дополнительном самоответстве), это не так - вывод: AS не поддерживает "передавать по ссылке";, кроме того, документация (смутно) использует термин "передать по ссылке" , чтобы означать "пройти по объекту" / "передать посредством совместного использования объектов".
Существует несколько способов, по которым изменение может распространяться, упорядочиваться по порядку (my):
-
Возвращает новое применимое значение:
AC2 = doSomeTransformation(AC1)
. Это вообще самое чистое. Избегайте побочных эффектов и удивительного кода. Множественные значения могут быть возвращены, если они привязаны к объекту (или массиву) по мере необходимости. -
Используйте закрытие:
doSomeTranformation(AC1, function (newValue) { AC2 = newValue })
где doSomeTransformation может выглядеть так:function doSomeTransformation(_ac1, finished) { ...; finished(_ac1) }
. Обычно я использую это только тогда, когда обратный вызов "работает в контексте" самой функции или при написании кода в стиле CPS. -
Мутировать объект (AS - это "pass by object", в конце концов). Это очень нехорошо, но это сработает.
var blah = {AC2: null}; doSomeTransformation(ac1, blah); ...; laterOn(blah.AC2)
где doSomeTransformation может выглядеть какfunction doSomeTransformation(_ac1, b) { ...; b.AC2 = _ac1; }
. Не рекомендуется вообще.
Счастливое кодирование.
Применимые выдержки из Стратегия оценки:
"вызов по ссылке": (мой основной аргумент для "вызова по ссылке" используется неправильно, так это то, что он уже имеет четко определенное значение; перегруженный термин, принятый на некоторых языках, таких как AS и Python просто добавляет путаницу)
При оценке посылки (также называемой "пересылкой" ) функция получает неявную ссылку на переменную, используемую как аргумент, а не на копию ее значения. Обычно это означает, что функция может изменять переменную, используемую как аргумент, - то, что будет видно ее вызывающей стороне.
"вызов по объекту" / "вызов путем совместного использования объектов": (но обратите внимание на то, где он признает несогласованность/локализацию этих терминов, термин "вызов по ссылке" часто используется неправильно чтобы подразумевать эту семантику, и "вызов по значению [ссылки]" используется в некоторых контекстах, чтобы также означать одно и то же)
Семантика обмена вызовами отличается от вызова по ссылке в том, что назначения для аргументов функции внутри этой функции не отображаются вызывающему (в отличие от семантики ссылок), так, например, если переменная была передана, невозможно смоделировать присвоение этой переменной в области вызова. Однако, поскольку функция имеет доступ к тому же объекту, что и вызывающий (без копирования), мутации для этих объектов, если объекты изменяемы, в пределах функции видны вызывающему, что может показаться отличным от позывных, семантика значения.