Вызов функции без переназначения именованного аргумента - PullRequest
4 голосов
/ 10 апреля 2019

У меня есть функция с именованными аргументами.

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

Я пытался сохранить значения ранее нажатых кнопок в переменных, но это не сработало.

Можно ли вызвать функции и назначить один аргумент ввремя без перезаписи других?

function mainFun({
  val1,
  val2,
  val3
}) {
  var value1 = val1,
    value2 = val2,
    value3 = val3;
  // console.log(value1, value2, value3);
  console.log(val1, val2, val3);
}
<button onclick="mainFun({val1 : 'Caller 1'})">First Event</button>
<button onclick="mainFun({val2 : 'Caller 2'})">Second Event</button>
<button onclick="mainFun({val3 : 'Caller 3'})">Third Event</button>

Пытается достичь:

При первом событии> Вызывающий абонент 1 не определено не определено

При втором событии> Caller 1 Caller 2 undefined

On Third Event> Caller 1 Caller 2 Caller 3

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 10 апреля 2019

Вы можете сохранить значения как свойство функции.

function mainFun({ val1 = mainFun.val1, val2 = mainFun.val2, val3 = mainFun.val3 }) {
    mainFun.val1 = val1;
    mainFun.val2 = val2;
    mainFun.val3 = val3;

    console.log(val1, val2, val3);
}
<button onclick="mainFun({ val1: 'Caller 1' })">First Event</button>
<button onclick="mainFun({ val2: 'Caller 2' })">Second Event</button>
<button onclick="mainFun({ val3: 'Caller 3' })">Third Event</button>

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

function mainFun(defaults = {}) {
    return function({ val1 = defaults.val1, val2 = defaults.val2, val3 = defaults.val3 }) {
        defaults.val1 = val1;
        defaults.val2 = val2;
        defaults.val3 = val3;

        console.log(val1, val2, val3);
    };
}

var work = mainFun();
<button onclick="work({ val1: 'Caller 1' })">First Event</button>
<button onclick="work({ val2: 'Caller 2' })">Second Event</button>
<button onclick="work({ val3: 'Caller 3' })">Third Event</button>
1 голос
/ 10 апреля 2019

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

Вы можете попытаться объявить свои значения вне вашей функции и предотвратить переопределение следующим образом:

var value1, value2, value3;
function mainFun({
  val1,
  val2,
  val3
}) {
   value1 = value1 || val1,
    value2 = value2 || val2,
    value3 = value3 || val3;
  console.log(value1, value2, value3);
}

То, что value1 || val1 в основном делает, это говорит: «Эй, если value1 уже имеет значение, используйте его.Если нет, используйте val1.Действует так же, как value1 = value1 !== undefined ? val1 : value1 или проще:

if (value1 === undefined) {
   value1 = val1;
} else { // obviously not needed
   value1 = value1;
}
1 голос
/ 10 апреля 2019
Переменные

value1, value2 и value3 являются локальными для вашей функции mainFun. Они собирают мусор после каждого mainFun выполнения.

Чтобы достичь того, чего вы хотите достичь, вам нужно где-то сохранить предыдущие параметры.

Есть много возможностей:

  • Одна из них - глобальные переменные:

let value1, value2, value3;

function mainFun({
  val1,
  val2,
  val3
}) {
    value1 = val1 || value1;
    value2 = val2 || value2;
    value3 = val3 || value3;
   console.log(value1, value2, value3);
  //console.log(val1, val2, val3);
}
<button onclick="mainFun({val1 : 'Caller 1'})">First Event</button>
<button onclick="mainFun({val2 : 'Caller 2'})">Second Event</button>
<button onclick="mainFun({val3 : 'Caller 3'})">Third Event</button>
  • Другим решением было бы сохранить их как свойства функций (как предложила Нина Шольц)
...