Javascript将对象传递给函数

Javascript将对象传递给函数,javascript,class,Javascript,Class,关于Javascript的快速问题,我找不到清晰简洁的答案 我正在构建一个应用程序,它远远领先于我以前所做的任何事情,并且涉及多个类的实例化。然后,这些对象被传递到一个处理类中,该类检查用户输入,在画布上绘制并更新已传递的对象 我想知道,JavaScript是如何处理将对象传递给函数的?我是传递对象的副本,还是传递对该对象的引用 所以,如果我的控制器类改变了一个对象变量,那么这个变量是到处都改变了,还是只在控制器看到的对象中改变了 对于这样一个简单、可能易于测试的问题,我很抱歉,但由于错误堆积,

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

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

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

所以,如果我的控制器类改变了一个对象变量,那么这个变量是到处都改变了,还是只在控制器看到的对象中改变了


对于这样一个简单、可能易于测试的问题,我很抱歉,但由于错误堆积,我甚至不确定此时是否正确创建了一个类。

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

当传入字符串或数字等基本类型变量时,值将按值传入。这意味着在函数中对该变量的任何更改都与函数外部发生的任何更改完全不同

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
如中所述,在JavaScript中,它总是按值传递,但对于对象,变量的值是一个引用

所以,这不是一个纯粹的通过引用。下面是一个理解此概念的示例:

例如:

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

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

changeObject(x);
alert(x.member)
输出:foo

相反,如果更改函数中的成员,对象将被更改:

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

changeMember(x);
alert(x.member)

输出:

您正在传递引用。Assignments
obj1=obj2
也只是创建对同一对象的更多引用。在javascript中,对象是通过referenceId传递的。你看,我看到了你的痛苦,因为答案是模糊的,但这为我澄清了问题。最好的办法是使用JSFIDLE做一些实验,以保持清晰:-)感谢链接,我不太确定语法,但它确实说明了我的方法;我一直在做第二部分,很高兴知道这是正确的。昨晚有200行代码和4个小时没有被浪费。对于你的第二句话,我不同意你的看法-这个函数可以很好地保存对所讨论对象的额外引用,并将它们提供给函数之外的其他代码。对象是否最初是通过文本创建的并不重要。好的,谢谢你提供的信息,尽管我不确定对象文本是什么。在MVC框架之外,我对类的经验是缺乏的,在MVC框架之外更是如此javascript@nnnnnn当然,您是对的,出于某种原因,我没有考虑函数可能会将其一个参数泄漏到全局状态的想法。这将教会我如何在20秒钟内做出响应。@ChrisMorris我基本上想说的是,如果你在函数调用中创建一个对象,那么很明显你没有传递一个引用到一个已经存在并且以前可以从任何其他地方访问的对象。NNNN指出,实际上函数可以获取该对象并将其引用存储在全局变量中,或者将其传递给其他函数,然后从其他地方可以访问该对象的引用。实际上,这并不是100%准确,它看起来像一个传递引用,有时它的行为也像它一样,但在javascript中,变量是通过引用传递的。对于对象和数组,传递的值是对对象的引用,但这与按引用传递略有不同。传递对象引用与传递对象本身不同。对不起,这里的标点符号是:)“但是在javascript中变量是通过引用传递的”-@lorenzo.marcon-在JS中则相反。所有内容都按值传递,但对于对象,值是对对象的引用。它不像其他一些语言中的“通过引用”,函数可以更改传入的变量。编辑:事实上,我刚刚注意到你在回答中说了这么多,所以我想这只是你评论中的一个输入错误。ehrm。。我的错,这是个打字错误。显然我指的是价值!在JS中总是按值。在写评论之前,我在回答中也写了这样的话。但是谢谢你指出这一点!我不知道是否有人可以纠正它,因为我不能再编辑它了。我们有这样的原因吗?另外,这在Javascript中被称为某种特殊现象吗?我认为这是理解范围和传递对象引用的混合体。更多信息请点击此处:
function changeMember(x) {
  x.member = "bar";
}

changeMember(x);
alert(x.member)