Можно ли одновременно вызвать несколько функций?
Например
var executed = false;
// loop 1
func();
// loop 2
func();
function func(){
if (executed) return;
executed = true;
alert(1);
}
Может ли func() выполняться 2 раза одновременно?
JavaScript не имеет встроенной поддержки одновременного запуска нескольких функций. Это исторически зависело от трудоемких задач (таких как ожидание HTTP-запроса или интенсивного процессора), обрабатываемых с помощью собственного кода, который представляет API для JS (и этот API принимает обратный вызов или, что совсем недавно, возвращает Promise).
Это начинает меняться.
Большинство веб-браузеров поддерживают Web Workers, а Node.js внедрила экспериментальную поддержку Worker Threads.
Каждый из них позволяет обрабатывать JavaScript-код отдельному процессу, который выполняется независимо от основного цикла событий и связывается с основным процессом с использованием сообщений.
Никакой процессор, который я знаю, не может выполнять операторы одновременно. Большинство компьютеров имеют несколько процессоров, поэтому они могут запускать несколько операторов на нескольких процессорах. Таким образом, единственное возможное решение - это открыть браузер дважды, открыть ту же страницу и надеяться, что js будет выполняться параллельно (или использовать некоторые причудливые NodeJS или WebWorkers и т.д.).
Однако вместо того, чтобы запускать одно и то же время, его обычно очень быстро переключаться между двумя потоками, чтобы он выглядел как одно и то же время (называемое многозадачностью). Вы можете сделать это в js следующим образом:
var executed = false;
var theother=new Promise( r=>setTimeout(r,0));
func();
// loop 2
func();
async function func(){
if (executed) return;
await theother;
executed = true;
alert(1);
}
Или старый стиль (чтобы решить магию):
var executed = false;
// loop 1
func();
// loop 2
func();
function func(){
if (executed) return;
setTimeout(function(){
executed = true;
alert(1);
},0);
}
Используйте ниже код
<!DOCTYPE html>
<html>
<head>
<title>sample test</title>
<script type="text/javascript">
print=function(msg) {
var ifunction=function(){
console.log(msg);
}
return ifunction;
};
button1=function(name,count){
for (var i =0 ;i <count; i++) {
setTimeout(print(name+":"+i+"seconds over after button1 click"),i*500);
}
};
</script>
</head>
<body>
<form>
<input type="" name="" />
<input type="button" value="button1" onclick="button1('button1',5)" />
<input type="button" value="button2" onclick="button1('button2',5)" />
</form>
</body>
</html>
Вы не можете этого сделать. Потому что JavaScript не поддерживает многопоточность. Каждая вкладка веб-браузера имеет только один интерпретатор и интерпретатор JavaScript в браузере - это один поток. См. Пример одного потока здесь.
См. Также этот ответ.