1

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

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

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

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

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

4

2 回答 2

2

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

  • myObj并且newObj只是变量,事物的名称。
  • 这些变量的值是对对象的引用
  • 当您调用 时doStuff(),您将名称绑定myObj到对您的对象的新引用(即引用本身是按值传递的)
  • 引用指向一块内存,里面有一些东西,这就是让你改变里面的名字的原因doStuff()
  • 您可以通过检查任一变量来查看该更改,因为这两个变量都包含对同一对象的引用
  • myObj = null将变量重新分配为空,在此过程中,它“破坏”引用,但不会破坏对象。
  • 当垃圾收集器注意到不再有对某个对象的引用时,它将销毁该对象
于 2013-05-30T06:58:51.760 回答
0

我将尝试帮助您了解 JavaScript 对象的工作原理:

当你说,

var newobj = new Object();

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

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

添加方法“名称”会将其添加到内存位置,因此对 newobj 和 myobj 都可用。

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

但是,我不知道这在动作脚本中是如何工作的。

于 2013-05-30T06:49:57.923 回答