在下面的javascript代码中,我在2秒后设置了一个计时器,其中的处理程序是提醒'doneMessage'的函数。当出现提示时,下一行应在我输入内容或取消提示后执行。
function setTimer(doneMessage, n) {
setTimeout(function() {
alert(doneMessage);
}, n);
prompt('Enter a number');
doneMessage = "OUCH!";
}
setTimer("Cookies are done!", 2000);
因此,如果我在“提示”上花费了2秒钟以上,则计时器事件应在执行下一行之前发生。在这种情况下,“ doneMessage”仍应为“ Cookies done!”。
为什么提醒“ OUCH”?
答案 0 :(得分:2)
JavaScript是一种单线程语言。
它不能同时运行1个以上的任务。
您当前的任务仍在执行,但被提示命令阻止。
完成提示并退出setTimer()函数后,该任务将有效完成。
这时,doneMessage设置为“ OUCH!”
JavaScript现在可以自由地执行下一个任务。
通常,它会循环所有超时,并查看是否有任何完成的计时器要执行,并将它们放入队列中以便下一步执行。
如果您单击按钮,它不会总是立即执行该按钮。它位于下一个要执行的任务队列中,但是具有较高的优先级以确保下一个要执行。如果当前不在执行任务的中间,则将立即处理您的按钮。
使用标记并创建自己的非线程阻止提示,您将获得想要的行为。