在以下代码中,为什么会提示“ OUCH”?

时间:2019-09-27 10:29:36

标签: javascript

在下面的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”?

1 个答案:

答案 0 :(得分:2)

JavaScript是一种单线程语言。

它不能同时运行1个以上的任务。

您当前的任务仍在执行,但被提示命令阻止。

完成提示并退出setTimer()函数后,该任务将有效完成。

这时,doneMessage设置为“ OUCH!”

JavaScript现在可以自由地执行下一个任务。

通常,它会循环所有超时,并查看是否有任何完成的计时器要执行,并将它们放入队列中以便下一步执行。

如果您单击按钮,它不会总是立即执行该按钮。它位于下一个要执行的任务队列中,但是具有较高的优先级以确保下一个要执行。如果当前不在执行任务的中间,则将立即处理您的按钮。

使用标记并创建自己的非线程阻止提示,您将获得想要的行为。