关于Javascript的快速问题我无法找到明确的简明答案。
我正在构建一个领先于我之前所做的任何事情的应用程序,并涉及实例化多个类。然后将这些对象传递到一个处理类,该类检查用户输入,绘制到画布并更新已传递的对象。
我想知道,JavaScript如何处理将对象传递给函数?我传递了对象的副本,还是我传递了对象的引用?
因此,如果我的控制器类改变其中一个对象变量,那么它是在任何地方改变的,还是只在该控制器看到的对象中改变了?
对于这么简单,可能很容易测试的问题感到抱歉,但由于错误堆积起来,我甚至不确定此时我是否正确上课。
答案 0 :(得分: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
答案 1 :(得分:3)
如https://stackoverflow.com/a/5314911/636348中所述,在JavaScript中,它总是按值传递,但对于对象,变量的值是引用。
所以,这不是一个纯粹的参考传递。这是一个理解这个概念的例子:
E.g:
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)
输出: bar
答案 2 :(得分:1)
如果传入一个指向对象的变量,它会传递对该对象的引用。如果传入一个对象文字,那么显然没有其他类或函数能够更改该对象。