Звоните по ссылке, стоимости и имени
Я пытаюсь понять концептуальную разницу между вызовом по ссылке, стоимости и имени.
Итак, у меня есть следующий псевдокод:
foo(a, b, c)
{
b =b++;
a = a++;
c = a + b*10
}
X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
Что такое X, Y и Z после вызова foo, если a, b и c - все вызовы по ссылке? если a, b и c являются вызовом по значению / результату? если a, b и c являются вызовом по имени?
Другой сценарий:
X=1;
Y=2;
Z=3;
foo(X, Y+2, X);
Я пытаюсь начать подготовку к предстоящему финалу, и это казалось хорошей проблемой для рассмотрения. Pass-by-name определенно самый чуждый для меня.
6 ответов
Когда вы передаете параметр по значению, он просто копирует значение в параметре функции, и все, что делается с этой переменной внутри функции, не отражает исходную переменную, например
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-по-имени
Вызов по значению: обычный способ... значения фактических параметров копируются в формальные параметры.
Вызов по ссылке: вместо параметров передаются их адреса, а формальные параметры указывают на фактические параметры.
Вызов по имени: подобно макросам, полное определение функции заменяет вызов функции, а формальные параметры - это просто другое имя для фактических параметров.
По значению - нет изменений в функции. все ваши действия исчезают, когда функция завершена.
По ссылке - ваши действия действительно меняют переменные. По имени - я никогда не слышал...
Передача x+1 не меняется, просто сообщает функции 3 вместо 2 или т. Д.
Это не изменит значение X, Y или Z, если оно передается по значению. Когда вы используете функцию, такую как "foo()", она в основном копирует переменные (x, y и z) в другие переменные (a, b и c) и выполняет с ними определенные действия, не изменяя оригиналы (x, у и г). Для того, чтобы вы изменили значение, вы должны вернуть значение, примерно так:
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.
В JavaScript:
- переменная типа примитива, такая как строка, число всегда передается как передаваемое значение.
Массив и объект передаются как передача по ссылке или передача по значению на основе этих условий.
если вы меняете значение этого объекта или массива с помощью нового объекта или массива, то оно передается по значению.
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
При вызове по значению передается копия переменной, тогда как при вызове по ссылке передается сама переменная. При вызове по значению фактические и формальные аргументы будут созданы в разных местах памяти, тогда как при вызове по ссылке фактические и формальные аргументы будут созданы в одной и той же области памяти.