是否可以在JavaScript的执行堆栈末尾放置一段代码

Is it possible to put a piece of code at the end of execution stack in JavaScript

本文关键字:代码 一段 JavaScript 堆栈 执行 是否      更新时间:2023-09-26

例如,我有许多处理程序在文本框的焦点之外。我想通过代码聚焦文本框,并在执行所有处理程序后运行另一个代码。

-------更新------

就我而言,我无法访问事件处理程序。它是一个具有自己的 UI 的外部模块。实际上我使用Chromium Embedded Framework。网页上的某些模块在聚焦后保存其数据。

是否可以在JavaScript的执行堆栈末尾放置一段代码

不可以,因为从技术上讲,您只能将东西放在堆栈的顶部,而不能放在堆栈下方。

但是,您可以利用这样一个事实,即在执行堆栈清除后,引擎会查看另一个称为"回调队列"的存储,其中已完成的异步操作的回调等待轮到它们被执行。


定时器

您可以使用计时器。计时器的工作方式是,计时器在计数完成时,将回调排队到回调队列中。如前所述,当执行堆栈清除时,引擎会查看回调队列,选取回调并执行它。所以从技术上讲,它不在堆栈的末尾,而是在堆栈清除后执行它,这应该看起来差不多。

但是,仅当所有其他处理程序执行同步代码时,才会执行此操作。如果其中一个执行异步操作(如 AJAX 或 timered 内容),JS 将以相同的方式对该 AJAX 回调进行排队,您将失去效果。在这里看到它的实际效果:http://jsfiddle.net/w8brztL4/


后期绑定

另一种方法是取消绑定您的处理程序以进行焦点输出并重新绑定它。这样,它是最后注册的,并且很可能会在附加的处理程序中最后执行。

但是,据我所知,jQuery的执行顺序是:绑定在元素上的所有处理程序首先到最后一个,然后父级首先绑定到最后一个,然后绑定到父级的父级首先到倒数第二个,依此类推。在这里看到它的实际效果: http://jsfiddle.net/rcc0c9em/为了获得最大的效果,请在很晚的地方绑定,例如在document上。

大多数浏览器都有一个名为 setImmediate(callback) 的函数,该函数在当前事件队列为空后立即将回调排队执行。

对于不支持它的浏览器,您可以得到几乎相同的东西 setTimeout(callback, 1) .