下一个刻度覆盖function函数将被调用

我需要重写下面的代码

这个函数将在下一个勾号中执行

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

有了这个,

 window.require.nextTick = function(fn) { fn(); }; 

由于该函数将被立即调用,在这种情况下,它将不会被执行下一个滴答声?

       

网上收集的解决方案 "下一个刻度覆盖function函数将被调用"

如果我将代码更改为第二个选项whethaer这将是有问题的,如果是的话为什么?

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

在事件循环的当前时间点之后执行一些事情。

同时调用fn违反了“在当前时间点之后”执行的规范。 (请参阅我的答案的结尾,在这里可能提出异议。)

如果您想知道为什么它可能是一个问题,请考虑RequireJS侦听DOM事件。 有一个像require.nextTick这样的函数可以让事件处理程序运行 。 如果你设置require.nextTick同步执行它的函数,那么你没有机会让事件处理程序运行。 在某些情况下,这可能会导致RequireJS停止正常工作。

在这一点上,可能会反对nextTick的定义是可以同步调用fn ,因为如果没有定义setTimeout ,那么它会同步调用fn

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

我认为这是针对不常见的情况 ,而不是模块通过HTTP请求asynchronous加载的普通情况。 在某些情况下,就像embedded式设备缺乏浏览器或Node.js提供的JS环境一样,执行一个使用RequireJS的软件的唯一方法是加载已经过r.js并包含require.js的优化包require.js在捆绑。 在这样的情况下 ,同步调用nextTick将会是没有意义的,因为在RequireJS执行的时候,所有的模块已经被加载了。

如果你有这样的function:

 window.require.nextTick = function(fn) { fn(); }; 

每次调用window.require.nextTick() ,都会立即执行fn()

如果我更改代码到第二个选项whethaer这将是有问题的

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

原始function有一些根本性的错误。 如果setTimeout是未定义的,则performance会非常不同。

Javascript运行在事件循环上 。 您的Javascript代码会一直运行直到完成,其他Javascript代码将在“队列”中等待。 例如,用户事件的事件监听器(如单击button)将“排队”,并等待当前代码完成。

您的nextTick函数大概意味着将函数添加到“队列”,以便稍后由事件循环执行。 这有时是有用的。 例如,您可以拥有自己的事件发射器,并希望排队您自己的事件。

因此,如果setTimeout未定义,您的nextTickfunction就会中断 。 它现在将执行该function,而不是将其添加到“队列”中。 这将导致完全不同的行为,这意味着只发生在某些浏览器的错误。

修正您的代码以使用此代替:

 window.require.nextTick = function(fn) { setTimeout(fn, 5) }; 

并忽略不实现setTimeout浏览器。 他们可以有一个很大的错误,而不是奇怪的微妙的错误。

只是为了logging, setTimeout在过去20年左右在所有主stream浏览器中都可以使用。 它支持回到IE4! 所以这个条件是完全不必要的。