Javascript 中是否有“即时事件”之类的东西?

hum*_*ace 5 javascript concurrency dom-events

即时事件”的概念/概念是否存在于 Javascript 实现中?

背景

在这个对“ javascript 是否保证是单线程的?这个问题的回答中,作者提到了一些他称之为即时事件的东西。这种即时事件是一个回调函数(即类似于浏览器窗口的“调整大小” ),它在其他一些 Javascript 代码尚未“完成”时执行,因为它被阻止(即)。window.onresize = callbackfunc;alert("alert");

让我用一个例子来澄清:

// (1) Setup a "immediate event" (a callback for "resize");
window.onresize = function(){ console.log("log resize"); };

// (2) Run some code which contains a blocking alert()
console.log("log A");
console.log("log B");
alert("alert");
console.log("log C");
Run Code Online (Sandbox Code Playgroud)

(作为 jsfiddle http://jsfiddle.net/rj25m/5/

上面脚本针对不同情况/场景的输出:

情况 1(不调整大小)

日志A
日志B
日志C

案例 2(Windows 在 之后调整大小alert("alert");

日志A
日志B
日志C
日志调整大小

案例 3有趣的案例(在alert("alert");弹出窗口期间调整了 Windows 的大小)

日志A
日志B
日志调整大小
日志C

注意:请注意(正如在提到的答案中也提到的),在某些系统上,在出现模态警报期间调整窗口大小并不容易。例如,在 MS Windows 中,需要临时减少屏幕旋转以引起窗口大小的调整。在其他系统中,大多数 linux 事件虽然有警报,但您仍然可以调整窗口大小。

注意 2:我只能在 Firefox 中重现(案例 3)输出(使用 26.0 版本)。IE 和 Chrome 似乎并不“支持”那些“即时事件”,而且似乎注意到了调整大小事件,但计划在被alert("alert").

案例 4(与案例 3 类似,但使用 Chrome/IE)

日志A
日志B
日志C
日志调整大小

我对 Firefox 构建中观察到的行为以及术语“立即事件”的用法感到困惑。我怀疑这样的事情是否真的存在。这就是我在这里问的原因,我希望有人熟悉并且可以参考 ECMAScript 的规范和/或参考实现的规范来回答。查看 MDN 对“运行到完成”的实际想法的引用, 我倾向于认为由即时事件描述的行为是不需要的,没有命名并且实际上是 Firefox 错误。alert自从他们引入新的(标签模式警报)以来,firefox 有一些麻烦。

我很高兴获得洞察力并愿意回答评论

Guf*_*ffa 1

Javascript 中不存在“立即事件”,通常代码永远不会被中断来处理事件。

像警报这样的模态弹出窗口的情况是唯一的例外。在某些浏览器中,当您调用警报时,方法中的代码可能会“暂停”,并且警报打开时会发生事件。通常,警报打开时不会有需要处理的事件,但显然您发现了异常。

通常,“运行至完成”原则是规则。除非您使用类似alert或 的东西prompt,否则您可以依赖不间断运行的代码,直到您退出函数。实际上,当代码运行时,浏览器中什么也没有发生;当 JavaScript 运行时,页面不会更新,甚至 GIF 动画也不会移动。