Actionscript传递引用方式

4
package {
    import flash.display.Sprite;

public class test1 extends Sprite {

private var tmp:Object;

public function test1() {
  createObj(tmp);
  if(tmp == null) {
    trace("nothing changed");
  }
}

private function createObj(obj:Object):void {
  obj = new Object();
}

}
}

在上面的代码中,控制台的输出是:
没有改变 为什么呢?
如果传递给createObj的参数是按引用传递的(这是actionscript的默认行为),为什么它没有被修改?
1个回答

4
您没有传递引用。您传递了null,它被分配给本地变量obj在函数内使用。关于按值或按引用传递参数的更多信息,请参见按值或按引用传递参数

被“按引用传递”意味着只传递了对参数的引用,而不是实际值。不会复制实际参数。相反,将创建对作为参数传递的变量的引用,并将其分配给局部变量以供函数内部使用。

createObj中,您正在创建一个新的引用,必须返回它:
public function test1() {
  tmp = createObj();
  if(tmp != null) {
    trace("Hello World!");
  }
}

private function createObj():Object {
  return new Object();
}

你的回答解决了OP的问题,但我想补充一下,null在这里并没有真正改变事物的工作方式。文档写得太糟糕了,整个段落都很混乱,几乎没有任何意义。AS将对象的引用存储在变量(或参数)中。引用是指向对象的“链接”,而不是对象本身。当传递给函数时,引用会被复制;因此它们是按值传递的。AS具有按值传递语义(这就是为什么你不能直接在AS中实现经典的“交换”示例)。AS通过值传递引用 - Juan Pablo Califano
2
这是一篇很好的文章,解释了按引用传递和按值传递引用之间的区别:http://javadude.com/articles/passbyvalue.htm。它是关于Java的,但同样适用于Actionscript。 - Juan Pablo Califano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接