Звоните по ссылке, стоимости и имени

Я пытаюсь понять концептуальную разницу между вызовом по ссылке, стоимости и имени.

Итак, у меня есть следующий псевдокод:

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:

  1. переменная типа примитива, такая как строка, число всегда передается как передаваемое значение.
  2. Массив и объект передаются как передача по ссылке или передача по значению на основе этих условий.

    • если вы меняете значение этого объекта или массива с помощью нового объекта или массива, то оно передается по значению.

      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

При вызове по значению передается копия переменной, тогда как при вызове по ссылке передается сама переменная. При вызове по значению фактические и формальные аргументы будут созданы в разных местах памяти, тогда как при вызове по ссылке фактические и формальные аргументы будут созданы в одной и той же области памяти.

Другие вопросы по тегам