“直接事件”的概念/概念是否存在于Javascript实现中?
在这个this answer问题“Is javascript guaranteed to be single-threaded?”中,作者提到了他所称的即时事件。这样的立即事件是一个回调函数(即类似于浏览器窗口window.onresize = callbackfunc;
的“调整大小”),在其他一些Javascript代码尚未“完成”时执行,因为对于instace它被阻止(即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");
(作为jsfiddle http://jsfiddle.net/rj25m/5/)
针对不同情况/场景的上述脚本输出:
案例1(不进行大小调整)
log A log B log C
案例2(在alert("alert");
之后调整Windows大小)
log A log B log C log resize
案例3 有趣案例(在alert("alert");
弹出窗口期间调整Windows大小
log A log B log resize log C
注意:请注意(如前面提到的answer中所述),在某些系统上,在有模态警报期间调整窗口大小并不容易。例如,在MS Windows中,需要暂时减少屏幕旋转以激活窗口的大小调整。在其他系统中,大多数linux,事件虽然有警报,但您仍然可以调整窗口大小。
注意2:(案例3)输出我只能在Firefox中复制(使用26.0版本)。 IE和Chrome似乎并没有“支持”那些“即时事件”,似乎已经注意到调整大小事件,但计划在完成阻止{{1 }}。
案例4(如Case3,但使用Chrome / IE)
log A log B log C log resize
我对Firefox构建中观察到的行为以及术语“即时事件”的使用感到困惑。如果像这样的东西确实存在,我有疑虑。这就是为什么我在这里问,我希望有人熟悉并且可以参考ECMAScript的规范和/或参考实现的规范来回答。
查看MDN对"run to completion"的实际想法的参考
我倾向于认为立即事件描述的行为是不可取的,没有任何名称,实际上是一个Firefox错误。由于他们引入了新的(标签模态警报),因此firefox与alert("alert")
有一些麻烦。
我很高兴有见识并愿意回答评论
答案 0 :(得分:1)
Javascript中没有“立即事件”的东西,通常代码永远不会被中断来处理事件。
像警报这样的模态弹出窗口是唯一的例外。在某些浏览器中,当您调用alert时,方法中的代码可以“保持”,并且在警报打开时会发生事件。通常情况下,警报打开时不会有需要处理的事件,但显然你发现了异常。
通常,“完成运行”原则就是规则。除非您使用alert
或prompt
之类的内容,否则在退出函数之前,您可以依赖不间断运行的代码。实际上,代码运行时浏览器没有任何反应;没有页面更新,甚至在运行Javascript时GIF动画也不会移动。