Javascript 如何从外部覆盖setTimeout

Javascript 如何从外部覆盖setTimeout,javascript,requirejs,prototype,Javascript,Requirejs,Prototype,我们正在项目中使用require.js,需要覆盖setTimeout 在第1802行中,这是我们需要设置为0或忽略此setTimeout的代码(我的意思是ru超过它),问题是,如果我在开源代码中明确更改它,当我更改版本时,代码将丢失,我应该如何从外部覆盖require.js文件的setTimout,并在我使用这个库时一直保存它,在js中是否可以优雅地执行 /** * Execute something after the current tick * of the event loop. O

我们正在项目中使用
require.js
,需要覆盖setTimeout 在第1802行中,这是我们需要设置为0忽略此setTimeout的代码(我的意思是ru超过它),问题是,如果我在开源代码中明确更改它,当我更改版本时,代码将丢失,我应该如何从外部覆盖require.js文件的
setTimout
,并在我使用这个库时一直保存它,在js中是否可以优雅地执行

/**
 * Execute something after the current tick
 * of the event loop. Override for other envs
 * that have a better solution than setTimeout.
 * @param  {Function} fn function to execute later.
 */
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 4);
} : function (fn) { fn(); };
这是Git中require.js开源的链接
第1802行

require
对象作为全局变量公开,因此您可以像这样重写其方法:

window.require.nextTick = function(fn) {
  setTimeout(fn, 0);
}
但我想不出有什么好的理由这么做


但是,这并不能解决您的问题,因为
setTimeout
调用无论如何都会受到浏览器的限制。更好的选择是简单地调用函数:

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

您可以在require的源代码中看到,原始nextTick函数可以有两种实现,具体取决于
setTimeout
的可用性-一种是
setTimeout
,另一种是只有在
setTimeout
未定义时(粘贴的代码段的最后一行)才具有函数调用。这就是为什么我认为像上面这样重写此函数不会引起任何问题。

为什么需要将其更改为0,而不是4ms?@RowlandShaw-嗨,Rowland这就是为什么每秒只能调用一次,根据答案there@RowlandShaw那么,你有没有其他更好的办法来跳过require.js每秒调用一次的问题?这是一个浏览器限制,所以不,除了不支持在后台使用之外,对于该浏览器谢谢1+,所以我需要在使用require.js之前使用它,这将覆盖nextTick?其原因是假设我想覆盖它,我的意思是忽略/删除setTimeout代码,我只需要在没有setTimeout的情况下放置代码?是的,我没有测试过,但应该可以工作。甚至函数的文档也说它可以被重写。但是,您的实现将引入一些不一致性,因为函数将不再执行“下一个勾号”中的代码,而是立即执行。感谢Xersie,如果我完全删除setTiemout,您说过以下内容:“函数将不再执行“下一个勾号”中的代码,而是立即执行”,这可能会引发哪些问题?它可能不会导致任何问题,您可以在他们的代码中看到,如果环境不支持
setTimeout
,他们只需调用提供的函数。除非你的代码以一种奇怪的方式使用这个函数。我的观点只是它很难看,不是很危险:)谢谢,但是你的意思是像下面这样删除setTimeout吗?window.require.nextTick=function(fn){}还是完全按照您提供的代码执行?最后一个问题:)您编写了“如果环境不支持setTimeout,他们只调用提供的函数的代码”,这是哪一行?谢谢