#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));
Сделает свое дело. Это работает для любого количества функций, сколько вы хотите.