我有一个看起来像下面这个功能的功能。它需要一个名为的对象
link
,调用getAdminParams
,然后使用该调用的返回值
更改链接对象中的属性:
function checkParams(link: Link) {
var rtn : IAdminParams = null,
table = null;
if (link.Action === "Create") {
if (link.Params == null) {
rtn = getAdminParams(link.Entity);
if (rtn.Success) {
link.Url = link.Href + rtn.Param;
table = rtn.Table;
} else {
link.$Link.prop('disabled', false);
return;
}
} else {
link.Url = link.Href + link.Params;
table = link.Entity;
}
} else {
link.Url = link.Href;
}
}
我正在调用以下函数。
function adminDialog($link: JQuery) {
var link = new Link($link);
checkParams(link);
doDialogAjax(link);
}
当我将链接值传递给checkParams(link)
时,它将被传递
参考?换句话说,我将在checkParams(link: Link)
中进行更改
函数可用于链接对象,因此可以在doDialogAjax
中使用它们
功能
答案 0 :(得分:3)
是的,没有。
“当我将链接值传递给checkParams(链接)时,它会是 通过引用传递?“
没有
“我将在checkParams中进行更改(链接:链接) 函数可用于链接对象,因此它们可以在 doDialogAjax功能?“
是
该变量未通过引用传递。它是按值传递的,但该值是参考值。
如果变量是通过引用传递的,则该函数可以更改变量。这不会发生:
function change(obj) {
// change the object
obj.value = 42;
// replace it with a new object
obj = { value: 1 };
}
// create an object
var a = { value: 0 };
// create another variable, to use in the call to the function
var b = a;
change(b);
alert(a.value); // shows 42, as the function changes the object passed in
alert(b.value); // shows 42, not 1, as the variable b is not changed by the function
如果变量是通过引用传递的,b
将被函数中的新对象create替换,而b.value
将是1
。
答案 1 :(得分:1)
是的,您在接收对象的函数中所做的更改在对象的其他用途中可见。
简单测试:
function increment(obj) {
obj.a++;
}
var myobj = {a:3};
increment(myobj);
document.write(myobj.a); // prints 4
回答评论:数组是对象,而works the same。
在这种精确的情况下,您可能会看到传递模式为“按引用传递”,但这只是使用另一种语言的一些词汇:您传递变量和变量值的值对象是他们的参考。 Archer的错误就是这个词汇表的问题:你无法替换变量的值:
function increment(obj) {
obj = {a:4}; // doesn't change the passed object, just the local variable obj
}
var myobj = {a:3};
increment(myobj);
document.write(myobj.a); // prints 3 because myobj isn't changed
换句话说:一个函数可以修改一个对象,该对象是传递给它的外部变量的值,它不能替换它。因为您没有像在C中那样传递对原始变量的引用。
答案 2 :(得分:-1)
当我将对象传递给javascript函数时,该对象是否通过引用传递?
对象的引用传递给函数(这是不“通过引用传递”,这完全是另一回事)。一个更简单的例子有助于说明这一点:
function foo(o1) {
console.log("foo1: o1.a = " + o1.a);
o1.a = "updated"; // <=== MODIFYING the object
console.log("foo2: o1.a = " + o1.a);
}
function bar(o2) {
console.log("bar1: o2.a = " + o2.a);
o2 = {a: "updated"}; // <=== Pointing to a DIFFERENT object (no effect outside function)
console.log("bar2: o2.a = " + o2.a);
}
var x = {a: "original x"};
foo(x); // Logs "foo1: o1.a = original x",
// then "foo2: o1.a = updated"
console.log(x.a); // Logs "updated"
var y = {a: "original y"};
bar(y); // Logs "bar1: o2.a = original y",
// then "bar2: o2.a = updated"
console.log(y.a); // Logs "original y", *NOT* "updated"
请注意,这是按值传递;与对象有关的值是对象引用。你可能会看到人们称之为“通过参考传递”,但这根本就是错误的。如果变量是“按引用传递”,则表示您可以在调用代码中更改变量的值。例如,这意味着我们的功能可以改变x
和y
所指的内容。但正如我们从bar
上面所看到的那样,它们不能。它们只能更改x
和y
引用的对象的属性,而不能更改x
和y
自身的属性。