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

#javascript #function #call #apply

#javascript #функция #вызов #применить

Вопрос:

Например, допустим, у меня есть две функции, a и b , и обе a и b принимают два string аргумента, а затем записывают эти строки в консоль:

 function a(w, x) {
  console.log(w, x);
}

function b(y, z) {
  console.log(y, z);
}
 

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

Например, вот некоторый псевдокод:

 (a, b).apply(window, ["Wello", "Horld"]);
 

Можно ли добиться этого, не используя циклы или не делая что-то подобное:

 var args = ["Wello", "Horld"];
a.apply(window, args);
b.apply(window, args);
 

Кроме того, можно ли одновременно вызывать более двух функций?

ПРИМЕЧАНИЕ: функции могут выполняться в любом порядке.

Спасибо.

Комментарии:

1. JavaScript имеет только один поток выполнения. Не имеет смысла думать о двух функциях, работающих «одновременно».

2. @Pointy только в том случае, если они не асинхронны.

3. @Lux ?? Это не имеет значения.

4. Итак, вы спрашиваете, есть ли какой-то способ начать выполнение последовательности вызовов функций? Для меня «сразу» означает «одновременно».

5. @Pointy 2 асинхронные функции могут выполняться одновременно. Конечно, никакие 2 оператора JS не могут быть параллельными, но если одна функция ожидает, другая может выполняться, в конце концов, это означает, что оба активны одновременно. Определение совместной многозадачности.

Ответ №1:

Можно ли вызвать a и b с помощью call или apply для передачи массива аргументов сразу обеим функциям?

Можно ли добиться этого, не используя циклы или не делая что-то подобное…

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

Например:

 for (const f of [a, b]) {
    f.apply(window, ["Wello", "Horld"]);
    // Or if you have the arguments as discrete things like that, I'd use call:
    //f.call(window, "Wello", "Horld");
}
 

Ответ №2:

Вам все равно может потребоваться некоторая итерация для функций, если вы возьмете функции в массив и вызовете их с Function#apply помощью .

 function a(w, x) {
    console.log(w, x);
}

function b(y, z) {
    console.log(y, z);
}

[a, b].forEach(fn => fn.apply(window, ["Wello", "Horld"])); 

Ответ №3:

Вам нужно использовать какой-то цикл.

 const args = ["Wello", "Horld"];
[a, b].forEach(f => f.apply(Windows, args));
 

Сделает свое дело. Это работает для любого количества функций, сколько вы хотите.