Javascript 下一个勾号覆盖功能不会调用该函数

Javascript 下一个勾号覆盖功能不会调用该函数,javascript,node.js,requirejs,event-loop,Javascript,Node.js,Requirejs,Event Loop,我需要重写以下代码 在这里,该函数将在下一次勾选中执行 req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { setTimeout(fn, 5); } : function (fn) { fn(); }; 有了这个, window.require.nextTick = function(fn) { fn(); }; 由于函数将立即被调用, 在这种情况下,是否在下一次勾选时不会执行它?如果您有这样一个函数

我需要重写以下代码

在这里,该函数将在下一次勾选中执行

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 5);
} : function (fn) { fn(); }; 
有了这个,

window.require.nextTick = function(fn) { fn(); };
由于函数将立即被调用,
在这种情况下,是否在下一次勾选时不会执行它?

如果您有这样一个函数:

window.require.nextTick = function(fn) { fn(); };
每次调用
window.require.nextTick()
fn()
都会立即执行

如果我将代码更改为第二个选项,则会出现问题

不,不会引起任何问题。第一个代码和第二个代码之间的唯一区别是,在第一个
fn()中,在5毫秒后调用,在第二个代码中立即调用。在这两个示例中,每次调用
window.require.nextTick()
时都会调用
fn()

如果我将代码更改为第二个选项,是否会出现问题?如果是,为什么

我不建议做出这样的改变,因为一般来说,这可能会有问题。
require.nextTick
(出现在函数定义之前)的文档说明:

在事件循环的当前勾号之后执行某些操作

同步调用
fn
违反了“在当前勾号之后”执行的规范。(关于可能的反对意见,请参见我回答的结尾。)

如果你想知道为什么会有问题,考虑一下RequireJS听DOM事件。像

这样的函数需要.nextTick
做的一件事是给事件处理程序一个运行的机会。如果您将
require.nextTick
设置为同步执行其功能,那么您就没有机会运行事件处理程序。在某些情况下,这可能导致RequireJS停止正常工作

在这一点上,人们可能会反对
nextTick
的定义,即允许它同步调用
fn
,因为如果未定义
setTimeout
,则它会同步调用
fn

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 4);
} : function (fn) { fn(); };

我认为这是针对异常情况的,而不是通过HTTP请求异步加载模块的普通情况。在某些情况下,比如缺少浏览器或Node.JS提供的JS环境的嵌入式设备,执行使用RequireJS的软件的唯一方法是加载经过
r.JS
优化的捆绑包,并在捆绑包中包含
require.JS
在这种情况下,同步调用
nextTick
调用
fn
是没有意义的,因为在RequireJS执行时,所有模块都已加载。

原始函数存在根本性的问题。如果未定义
setTimeout
,则其行为非常不同

Javascript在一个虚拟机上运行。您的Javascript代码一直运行到完成为止,其他Javascript代码将在“队列”中等待轮到它。例如,用户事件的事件侦听器(如单击按钮)将“排队”,并等待当前代码完成

您的
nextTick
函数可能是要向“队列”添加一个函数,以便稍后由事件循环执行。这有时很有用。例如,您可以拥有自己的事件发射器,并希望对自己的事件进行排队

因此,如果未定义
setTimeout
,则您的
nextTick
函数将中断。它将立即执行函数,而不是将其添加到“队列”中。这将导致完全不同的行为,这意味着只有某些浏览器才会出现bug

请修复您的代码以改用此代码:

window.require.nextTick = function(fn) { setTimeout(fn, 5) };
并忽略未实现
setTimeout
的浏览器。他们可以有一个巨大的错误,而不是奇怪的微妙的错误


为了记录在案,
setTimeout
在过去20年左右的时间里在所有主流浏览器中都能正常工作。它支持回到IE4!因此,这个条件是完全不必要的。

您到底想要什么?@BhojendraNepal-我想验证在更改后的下一个勾号上是否会调用该函数……最后定义的函数将覆盖上一个函数,因此不会执行上一个函数。非常不清楚您想要在这里实现什么。。