Ste*_*ven 10 apache-flex arraycollection
我想通过flex 3中的函数将arrayCollection#2 =设置为arrayCollection#1.我将两个数组都传递给一个函数并设置arrayCollection#2 = arrayCollection#1.但是,似乎没有通过引用传递arrayCollection#2,因为在函数调用之后,arrayCollection#2没有被更改.我的理解是它应该通过引用和工作传递,我做错了什么?以下是代码:
var AC1:ArrayCollection = new ArrayCollection;
var AC1.addItem(someObject);
var AC2:ArrayCollection = new ArrayCollection;
setAC2(AC1,AC2);
// AC2 is not set to AC1 after the function
private function setAC2(_ac1:ArrayCollection, _ac2:ArrayCollection):void
{
_ac2 = _ac1;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
请参阅评估策略.
AS使用"按对象传递"/"通过对象共享传递".也就是说,传递"对象"(不是复制,克隆或复制),并且共享对对象的任何修改.
但是,赋值_ac2 = _ac1仅更改[function的local]参数变量的值,并且在函数调用期间不会影响任何变量.传入的唯一内容是值("对象"),它是由函数调用中使用的变量(或任意表达式)的求值得出的.
这是因为,如上所述,所用的策略是"通由对象",而不是(如文档状态"通过引用传递",这实际上意味着,或只是"由[的基准]值传递" ..."传递对象").也就是说,"通过引用传递"一词实际上被误用,因此令人困惑.(它在许多语言和文档中被滥用.试图达到共同意义是一场艰苦的战斗.)
如果它真的是 "通过引用传递",那么分配一个新值_ac2将传播出去.(在发表评论说AS是如何"通过引用传递"之前,请查看顶部的链接并认为"通过引用传递"涵盖了C#out/ref,VB ByRef,TSQL output和C++(参考)的情况&- 这些概念不在AS,Javascript或Java).但是,正如在原始帖子中正确指出的那样(以及额外的自我回复),情况并非如此 - 结论:AS不支持"通过引用传递"; 此外,文档(令人困惑地)使用术语"通过引用传递"来表示"按对象传递"/"通过对象共享传递".
有几种方法可以传播出来,按(我的)偏好顺序排序:
返回新的适用值:AC2 = doSomeTransformation(AC1).这通常是最干净的.避免副作用和令人惊讶的代码.如果适当地包装在对象(或数组)中,则可以返回多个值.
使用闭包:doSomeTranformation(AC1, function (newValue) { AC2 = newValue })doSomeTransformation可能如下所示:function doSomeTransformation(_ac1, finished) { ...; finished(_ac1) }.我通常只在函数本身的回调"在上下文中运行"或以CPS样式编写代码时才使用它.
突变一个对象(毕竟AS是"通过对象传递").这非常狡猾,但它会起作用.
var blah = {AC2: null}; doSomeTransformation(ac1, blah); ...; laterOn(blah.AC2)doSomeTransformation可能看起来像什么function doSomeTransformation(_ac1, b) { ...; b.AC2 = _ac1; }.一般不推荐.
快乐的编码.
适用的摘录,来自评估策略:
"通过引用呼叫": (正在为"按引用呼叫"我的主要参数不正确地使用的是,它已经具备了定义明确的含义;通过一些语言,如AS和Python通过重载术语只是增加了混淆)
在逐个引用的评估(也称为pass-by-reference)中,函数接收对用作参数的变量的隐式引用,而不是其值的副本.这通常意味着该函数可以修改用作参数的变量 - 其调用者将看到的内容.
"按对象调用"/"通过对象共享调用":(但要注意它承认这些术语的不一致/本地化;术语"引用调用"经常被误用来暗示这些语义和"按值调用"[引用]"在某些情况下使用也意味着相同的事情)
call-by-sharing的语义与call-by-reference的不同之处在于,函数内的函数参数的赋值对调用者是不可见的(与引用语义不同),因此,例如,如果传递了变量,则不是可以在调用者的范围内模拟该变量的赋值.然而,由于功能可以访问相同的对象调用者(没有复制时),突变的那些对象,如果该对象是可变的,在函数内是可见的呼叫者,这可能表现为从呼叫逐不同价值语义.
| 归档时间: |
|
| 查看次数: |
1975 次 |
| 最近记录: |