javascript / actionscript真的通过引用传递吗?

时间:2013-05-30 06:38:28

标签: javascript actionscript

据我所知,javascript也是基于ECMAscript和actionscript一样,并没有真正通过引用传递对象。至少那是我最近读到的。例如:

function doStuff(myObj){
   myObj.name = 'groovy chicken';
   myObj = null;
}
var newObj = new Object();
doStuff(newObj);

这是我在“面向Web开发人员的专业Javascript”一书中找到的一个例子。虽然您正在将对象传递给函数,并且添加name属性实际上会将该属性添加到初始对象,但是当您设置为null时,该对象将在本地范围内销毁,而不是在全局范围内销毁。

对我来说,这仍然有点令人困惑,因为你拥有的myObj仍然指向与newObj相同的位置,你可以实际添加或改变属性。唯一的区别是你不能从全球范围内销毁它。

所以我想知道同样的情况是否同样适用于actionscript,因为从我读过的内容来看,actionscript 3实际上是通过引用传递对象而我没有读到任何相反的东西。

2 个答案:

答案 0 :(得分:2)

很少有现代编程语言通过引用传递(至少默认情况下)。在“传递...”的扭曲术语中,您通过值传递引用。以下是如何思考:

  • myObjnewObj只是变量,是事物的名称。
  • 这些变量的值是对象的引用
  • 当您致电doStuff()时,您将名称myObj绑定到对象的新引用(即引用本身已按值传递)
  • 该引用指向一块内存,其中包含一些内容,这使您可以更改doStuff()
  • 内的名称
  • 您可以通过检查任一变量来查看更改,因为两个变量都包含对同一对象的引用
  • myObj = null将变量重新分配给任何东西,并且在此过程中,它“破坏”引用,但它不会破坏对象。
  • 当垃圾收集器注意到没有对对象的更多引用时,它将销毁该对象

答案 1 :(得分:0)

我会尽力帮助您理解JavaScript对象的工作原理:

当你说,

var newobj = new Object();

这里,newobj只是在创建Object实例时分配的内存位置的名称。

当您传递newobj时,它会引用内存位置。现在,函数中的myObj是同一内存位置的另一个名称。

添加方法'name'会将其添加到内存位置,因此newobj和myobj都可以使用。

当你将myobj设置为null时,它将删除该命名引用,并且newobj仍然保持活动状态并设置了name属性。

但是,我对动作中的工作原理并不了解。