【问题标题】:Javascript passing object to functionJavascript将对象传递给函数
【发布时间】:2013-06-28 08:53:26
【问题描述】:

关于 Javascript 的快速问题,我找不到一个清晰简洁的答案。

我正在构建一个应用程序,它远远领先于我之前所做的任何事情,并且涉及多个被实例化的类。然后将这些对象传递到一个处理类,该处理类检查用户输入、绘制到画布上并更新已传递的对象。

我想知道,JavaScript 如何处理将对象传递给函数?我是在传递对象的副本,还是传递对对象的引用?

那么,如果我的控制器类改变了一个对象变量,那是在所有地方都改变了,还是仅仅在那个控制器看到的对象中改变了?

很抱歉这么简单,可能很容易测试的问题,但由于错误堆积,我什至不确定我是否在这一点上正确地上课。

【问题讨论】:

  • 你传递了一个参考。分配obj1 = obj2 也只是创建对同一对象的更多引用。
  • 在javascript中对象是通过引用传递的
  • 你看到了吗this answer? 我看到你的痛苦,因为答案是模棱两可的,但这为我解决了问题。为了清楚起见,最好的办法是对 jsFiddle 进行一些试验:-)
  • 感谢您的链接,我不太确定语法,但它确实说明了我在第二部分中所做的方式,很高兴知道它正在正确完成。 200 行代码和昨晚的 4 小时没有浪费。

标签: javascript class


【解决方案1】:

当传入像字符串或数字这样的原始类型变量时,值是按值传入的。这意味着在函数中对该变量的任何更改都与函数外部发生的任何事情完全分开。

function myfunction(x)
{
      // x is equal to 4
      x = 5;
      // x is now equal to 5
}

var x = 4;
alert(x); // x is equal to 4
myfunction(x); 
alert(x); // x is still equal to 4

传递一个对象,但是,通过引用传递它。在这种情况下,该对象的任何属性都可以在函数内访问

function myobject()
{
    this.value = 5;
}
var o = new myobject();
alert(o.value); // o.value = 5
function objectchanger(fnc)
{
    fnc.value = 6;
}
objectchanger(o);
alert(o.value); // o.value is now equal to 6

【讨论】:

  • 实际上这不是 100% 准确的,它看起来像 引用传递,有时它的行为也如此,但在 javascript 中变量是通过引用传递的。对于对象和数组,传递的值是对对象的引用,但这与说它是通过引用传递的略有不同。传递对象引用不同于传递对象本身。对不起标点符号:)
  • “但在 javascript 中变量是通过引用传递的” - @lorenzo.marcon - 在 JS 中则相反。一切都是按值传递的,但是对于对象,值是对对象的引用。它不像其他一些语言中的“通过引用”,其中函数可以更改传入的变量。编辑:实际上我只是注意到你在回答中说了很多,所以我认为这只是你评论中的一个错字。
  • ehrm.. 我的错,这是一个错字。显然我的意思是价值!在 JS 中总是按值计算。在写评论之前,这也是我在回答中所写的。但感谢您指出!我想知道是否有人可以纠正它,因为我不能再编辑它了。
【解决方案2】:

正如https://stackoverflow.com/a/5314911/636348 中所述,在 JavaScript 中它总是按值传递,但对于对象,变量的值是一个引用。

所以,这不是纯粹的引用传递。下面是一个理解这个概念的例子:

例如:

x = {member:"foo"}

如果您在函数内使用另一个对象更改对象,您将不会在函数范围之外获得新对象,因为您只是创建了另一个对象。原始引用仍然绑定到原始对象:

function changeObject(x) {
  x = {member:"bar"};
}

changeObject(x);
alert(x.member)

输出:foo

相反,如果您在函数内更改成员,则对象将被更改:

function changeMember(x) {
  x.member = "bar";
}

changeMember(x);
alert(x.member)

输出:条形

【讨论】:

【解决方案3】:

如果你传入一个指向一个对象的变量,它就会传递一个对该对象的引用。如果您传入一个对象字面量,那么显然没有其他类或函数能够更改该对象。

【讨论】:

  • 我想对你的第二句话有所不同 - 该函数可以很好地保存对相关对象的额外引用,并使它们可用于函数之外的其他代码。对象最初是否是通过文字创建的无关紧要。
  • 好的 好的 谢谢你的信息,虽然我不确定什么是对象文字。我的类经验在 MVC 框架之外缺乏,在 javascript 之外也缺乏
  • @nnnnnn 你当然是对的,出于某种原因,我没有考虑到函数可能会将其参数之一泄漏到全局状态的想法。这将教会我在 SO 上触发 20 秒的响应。
  • @ChrisMorris 我基本上想说的是,如果您创建一个对象作为函数调用的一部分,那么显然您不会传递对存在且以前可以从任何地方访问的对象的引用别的。 nnnnnn 指出,实际上该函数可以获取该对象并将对它的引用存储在全局变量中,或者将其传递给其他函数,然后可以从其他地方访问对该对象的引用。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2017-07-21
  • 2017-08-20
相关资源
最近更新 更多