<script src="index.js"></script>
<script async src="index.js"></script>
<script defer src="index.js"></script>
for(let i = 0 ;i < 10000; i++> ) {
document.getElementById(‘container‘).innerHTML+=‘<span>我是一个小测试</span>‘
}
在这里,每次调用 DOM 接口会带来一定的消耗,这时我们可以缓存一些不必要的消耗;而且我们是每次遍历取拼接,这样会修改长度和高度,导致了回流 let containerDom = document.getElementById(‘container‘)
let count = 10000;
let content = ‘‘
for(let i = 0 ;i < count; i++> ) {
content+=‘<span>我是一个小测试</span>‘
}
containerDom.innerHTML = content
let container = document.getElementById(‘container‘)
// 创建一个DOM Fragment对象作为容器
let content = document.createDocumentFragment()
for(let count=0;count<10000;count++){
// span此时可以通过DOM API去创建
let oSpan = document.createElement("span")
oSpan.innerHTML = ‘我是一个小测试‘
// 像操作真实DOM一样操作DOM Fragment对象
content.appendChild(oSpan)
}
// 内容处理好了,最后再触发真实DOM的更改
container.appendChild(content)
let callbacks = []
let pending = false
export function nextTick (cb?: Function, ctx?: Object) {
let _resolve
callbacks.push(() => {
if (cb) {
try {
cb.call(ctx)
} catch (e) {
handleError(e, ctx, ‘nextTick‘)
}
} else if (_resolve) {
_resolve(ctx)
}
})
// 检查上一个异步任务队列(即名为callbacks的任务数组)是否派发和执行完毕了。pending此处相当于一个锁
if (!pending) {
// 若上一个异步任务队列已经执行完毕,则将pending设定为true(把锁锁上)
pending = true
// 是否要求一定要派发为macro任务
if (useMacroTask) {
macroTimerFunc()
} else {
// 如果不说明一定要macro 你们就全都是micro
microTimerFunc()
}
}
// $flow-disable-line
if (!cb && typeof Promise !== ‘undefined‘) {
return new Promise(resolve => {
_resolve = resolve
})
}
}
原文:https://www.cnblogs.com/tutao1995/p/14268181.html