Open FrankKai opened 6 years ago
setTimeout()方法必须返回由timer initialization step返回的值,传递它们到方法的实参数组,运行该算法的方法所针对的对象作为method context实现(Window或WorkerGlobalScope对象),并将重复标志设置为false。
setInterval()方法必须返回由timer initialization step返回的值,传递它们到方法的实参数组,运行该算法的方法所针对的对象作为method context实现(Window或WorkerGlobalScope对象),并将重复标志设置为true。
clearTimeout() 或者clearInterval()方法必须清除调用的WindowOrWorkerGlobalScope对象上的active timer列表的处理器入口,如果有的话,handle会传递给方法。(如果handle不能表明调用的WindowOrWorkerGlobalScope对象上的active timer列表的处理器入口的话,方法不做任何事。)
注意:因为clearTimeout()和clearInterval()清楚了同一个列表的入口,所以两种方法既可以清除setTimeout() timer,又可以清除setInterval() timer。
关键词:method context,method context,repeat flag,可选的预处理器,遵循以下步骤:
var log = '';
function logger(s) { log += s + ' '; }
setTimeout({ toString: function () { setTimeout("logger('ONE')", 100); return "logger('TWO')"; } }, 100);
17. 可选的,等待另一个user-agent定义的时间
笔记:这旨在允许用户代理根据需要填充超时以优化设备的电源使用情况。例如,一些处理器具有低功耗模式,其中定时器的粒度减小;在这样的平台上,用户代理可以减慢定时器以适应这个时间表,而不需要处理器使用更精确的模式及其相关的更高功率使用。
18. 队列化任务
一旦任务处理完毕,如果重复标志为false,则从活动定时器列表中删除句柄条目是安全的(检测条目的存在是无法通过此点检测的,因此它在技术上不会以某种方式或另一种方式)
毫不时延地去一毫秒一毫秒运行任务,同时回到浏览器以避免starving用户界面,也就是留白(也避免浏览器杀掉占用CPU的script)。在执行工作前,简易队列化下一个timer。
function doExpensiveWork(){
var done = false;
//...
//函数的这一部分占用5毫秒
//当我们结束之后,设置done为true
//...
return done;
}
function rescheduleWork() {
var handle = setTimeout(rescheduleWork,0);// 预先安排下一次迭代
if(foExpensiveWork()){
clearTimeout(handle);//如果我们不需要这个句柄,清除掉它
}
}
function scheduleWork() {
setTimeout(rescheduleWork,0)
}
scheduleWork();//队列化task去做大量工作
其实还是很懵逼的状态,但是可以引申出一些子问题。
通过重写setTimeout和clearTimeout的方式,将数据统计到window.activeTimer属性上。 这种实现方式可以确保增量式扩展函数,也就是先保留原始函数,之后再声明同名函数并且赋新的函数给它,在新函数体内部做扩展,但是需要在函数内部return原始函数的处理结果。
window.originalSetTimeout=window.setTimeout;
window.originalClearTimeout=window.clearTimeout;
window.activeTimers=0;
window.setTimeout=function(func,delay)
{
window.activeTimers++;
return window.originalSetTimeout(func,delay);
};
window.clearTimeout=function(timerID)
{
window.activeTimers--;
window.originalClearTimeout(timerID);
};
例如: 新增6个active timer
for(var i=0;i<6;i++){
setTimeout(function(){
console.log(i)
},0)
}
console.log(i)
window.activeTimers;//6个timer
清除2 active timer:
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i)
},0)
}
console.log(i)
window.activeTimers;//剩余4个active timer
参考:https://stackoverflow.com/questions/858619/viewing-all-the-timeouts-intervals-in-javascript
在求值之前,所有的ECMAScript代码将会与一个realm联系起来。 从概念上来说,一个realm由内在对象的集合组成,一个ECMAScript全局环境,所有的ES代码都将在这个全局环境的scope中加载,然后是其他相关的state和resource。
一个realm在规范中的定义是Realm Record,它有不同的值。
Field Name | Value | Meaning |
---|---|---|
[[Intrinsics]] | 记录其字段名称是内部键,其值是对象 | 与此领域相关的代码使用的内在值 |
[[GlobalObject]] | Object | 这个realm的全局对象 |
[[GlobalEnv]] | 词法环境 | 这个realm的全局环境 |
[[TemplateMap]] | 记录列表{[[Site]]:解析节点,[[Array]]:Object}。 | 使用Realm Record的[[TemplateMap]]为每个领域单独规范化模板对象。每个[[Site]]值是一个TemplateLiteral的Parse节点。关联的[[Array]]值是传递给标记函数的相应模板对象。(一旦Parse节点变得无法访问,相应的[[Array]]也无法访问,如果一个实现从[[TemplateMap]]列表中删除了这个对,这将是不可见的。) |
[[HostDefined]] | 任意值,默认值为undefined | 字段保留供需要将附加信息与Realm Record关联的主机环境使用。 |
active script由以下算法组成:
过于深奥,暂不深入。
timer nesting level是task的一个属性。
过于深奥,暂不深入。
关键词:task ,task queue ,event loop,task source,starved task queue
说到task queue,其实就要说到event loop,因为一个事件循环有一个或者多个任务队列,关于事件循环,有以下算法: task
task queue ,event loop,task source,starved task queue
例如:例如,用户代理可以有一个用于鼠标和键盘事件的任务队列(用户交互任务源),另一个用于其他任务。然后,用户代理可以在四分之三的时间内给予键盘和鼠标事件优先于其他任务,保持界面响应但不会挨饿其他任务队列,并且从不处理来自任何一个任务源的事件
参考:https://html.spec.whatwg.org/multipage/webappapis.html#task-queue
来源:https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html setTimeout()和setInterval()方法允许作者调用timer-based回调函数。
handle = self.setTimeout(handler,[,timeout[,arguments...]])
在timeout毫秒时延之后,设定一个timeout运行handler。任何实参数组都会通过arguments被直接传递到handler中。 -handle = self.setTimeout(code,[,timeout])
在timeout毫秒时延之后,设定一个time去编译运行code。self.clearTimeout(handle)
通过传入setTimeout()或者setInterval()的handle,取消timeout。handle = self.setInterval(handler,[,timeout[,arguments...]])
设定一个timeout每隔一段运行handler。任何实参数组都会通过arguments被直接传递到handler中。handle = self.setInterval(code,[timeout])
在timeout毫秒时延之后,设定一个time去编译运行code。self.clearInterval(handle)
通过传入setInterval()或者setTimeout()的handle,取消timeout。注意:Timers是可以嵌套的;在5个类似的嵌套timer之后,interval的最小时间间隔是4毫秒。 注意:这个API不会保证按照设定的方法去运行。可能会由于CPU负载,或者任务等等受到影响。
实现WindowOrWorkerGlobalScope mixin的对象具有活动计时器的列表。列表中的每个入口,由一个数字标记,它必须在实现WindowOrWorkerGlobalScope mixin对象的生命周期列表中唯一。