方法取自《高性能JavaScript》
- 是不是就是用递归替代循环?
- 这种方法常用吗,或者有什么更好的方法吗?
实例:
`for(let i = 0; i < item.length; i++) {
process(item[i])
}`
<=>
let todo = item.concat();
setTimeout(() => {
process(todo.shift());
if(todo.length > 0) {
setTimeout(arguments.callee, 25)
}else {
callback(item)
}
}, 25)
1、是不是就是用递归替代循环
看起来是,实际上不是,变成了递归只是表象,不是这里的关键。实际上这里所做的优化是把一个时间复杂度高的操作分割成多次进行,防止这种时间复杂度高的操作长时间占用主线程,导致页面卡顿的问题。
2、这种方法常用吗,或者有什么更好的方法吗?
这种其实更偏向于理念,一些库或者框架底层实现会用(比如 React 的 fiber 就跟这个很类似),但是普通开发中用的不算多,这种时间复杂度高的操作不常见,大部分也可以仍给 worker 处理。