7

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

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

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

因此,如果我的控制器类更改了其中一个对象变量,那么它是随处更改还是仅在该控制器看到的对象中更改?

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

4

3 回答 3

3

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

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
于 2013-06-28T09:06:14.557 回答
3

正如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)

输出:酒吧

于 2013-06-28T09:09:26.920 回答
1

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

于 2013-06-28T08:57:14.647 回答