我试图理解按引用,值和名称调用之间的概念差异。
所以我有以下伪代码:
foo(a, b, c)
{
b =b++;
a = a++;
c = a + b*10
}
X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
如果a,b和c都是通过引用调用的话,foo调用后的X,Y和Z是什么? 如果a,b和c是按值调用/结果? 如果a,b和c是名字?
另一种情况:
X=1;
Y=2;
Z=3;
foo(X, Y+2, X);
我正在努力开始研究即将到来的决赛,这似乎是一个很好的评论问题。名字传递对我来说绝对是最陌生的。
答案 0 :(得分:5)
当您按值传递参数时,它只是复制函数参数中的值,并且函数中对该变量所做的任何事情都不会反映原始变量,例如。
foo(a, b, c)
{
b =b++;
a = a++;
c = a + b*10
}
X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
//printing will print the unchanged values because variables were sent by value so any //changes made to the variables in foo doesn't affect the original.
print X; //prints 1
print Y; //prints 2
print Z; //prints 3
但是当我们通过引用发送参数时,它会复制变量的地址,这意味着无论我们对函数中的变量做什么,实际上都是在原始内存位置完成的,例如。
foo(a, b, c)
{
b =b++;
a = a++;
c = a + b*10
}
X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
print X; //prints 2
print Y; //prints 5
print Z; //prints 52
通过名字传递; Pass-by-name
答案 1 :(得分:2)
按值调用:正常方式...将实际参数的值复制到形式参数中。
按引用调用:代替参数,传递地址,形式参数指向实际参数。
按名称调用:与宏一样,整个函数定义替换函数调用,形式参数只是实际参数的另一个名称。
答案 2 :(得分:1)
按价值 - 功能没有变化。当函数完成时,你的所有动作都会消失。
通过引用 - 您的行为确实会改变变量。 通过名字 - 我从未听说过......
传递x + 1不会改变,只是告诉功能3而不是2等......
答案 3 :(得分:0)
如果它是值传递,则不会更改X,Y或Z的值。当你使用诸如“foo()”之类的函数时,它基本上将变量(x,y和z)复制到其他变量(a,b和c)中,并使用它们执行某些操作,而不更改原件(x, y和z)。要更改值,您必须返回一个值,如下所示:
foo(a, b, c)
{
a = a++;
b = b++;
c = a + b * 10;
return c;
}
x = 1;
y = 2;
z = 3;
z = foo(x, y+2)
然后x和y将是相同的,但是z将是(x + 1)+(y + 1)* 10,在这种情况下将是32。
答案 4 :(得分:0)
在javascript中:
Array和Object作为传递引用传递,或者根据这些条件传递值。
如果要使用新的Object或Array更改该Object或数组的值,则它将通过Value传递。
object1 = {item: "car"};
array1=[1,2,3];
这里你要分配新的对象或数组。你没有改变属性的值 旧的对象。所以它是通过价值。
如果要更改对象或数组的属性值,则它将通过引用传递。
object1.item= "car";
array1[0]=9;
这里你要更改旧对象的属性值。你没有将新对象或数组分配给旧对象。所以它是通过引用传递的。
<强>代码强>
function passVar(object1, object2, number1) {
object1.key1= "laptop";
object2 = {
key2: "computer"
};
number1 = number1 + 1;
}
var object1 = {
key1: "car"
};
var object2 = {
key2: "bike"
};
var number1 = 10;
passVar(object1, object2, number1);
console.log(object1.key1);
console.log(object2.key2);
console.log(number1);
Output: -
laptop
bike
10
答案 5 :(得分:0)
在按值调用中,传递变量的副本,而在按引用调用中,传递的是变量本身。在值调用中,实际和形式参数将在不同的内存位置创建,而在引用调用中,实际和形式参数将在相同的内存位置创建。< /p>