如果JS某段代码执行时间过久,会影响定时器任务的执行 function bar() { console.log('bar') // bar并不会被立即打印,而是等到for循环结束之后才被打印 } function foo() { setTimeout(bar, 0); for (let i = 0; i < 5000; i++) { console.log(i) } } foo() 如果setTimeout存在嵌套,那么系统会设置最短时间间隔为4毫秒 在Chrome中嵌套调用大于等于5次,系统会判断该函数方法被阻塞了,如果定时器的调用时间间隔小于 4 毫秒,那么浏览器会将每次调用的时间间隔设置为 4 毫秒 function testSetTimeoutFor4MS () { let index = 0 let timer = null function cb () { console.timeEnd(index) if (index >= 10) { clearTimeout(timer) timer = null return false } console.time(..... 关于setTimeout的小“秘密” JavaScript
JavaScript语言原理 [TOC] 自动插入分号规则 有换行符,且下一个符号是不符合语法的,就尝试插入分号 有换行符,且语法中规定此处不能有换行符,就自动插入分号 源代码结束处,不能形成完整的脚本或者模块结构,就自动插入分号 no LineTermiator here规则:表示它所在的结构中的这一位置不能插入换行符,和规则2强相关 带标签的continue语句,不能在continue后插入换行 带标签的break语句,不能在break后插入换行 return后不能插入换行 后自增、后自减运算符前不能插入换行 凡是async关键字,后面都不能插入换行 箭头函数的剪头前,不能插入换行 yield之后,不能插入换行 throw和Exception之间不能插入换行 以下情况要注意添加分号 以括号开头,即token为( 以数组开头,即token为[ 以正则表达式开头,即token为/ 以Template开头的语句,即token为` JavaScript语言原理 JavaScript