每日一题-修改代码不造成死循环
·
1 min read
如下为一道前端试题,要求是修改代码不造成死循环
。
while (1) {
console.log(Math.random());
}
分析
首先要知道
- JS是
单线程
- JS不存在真正意义的
并行
,但存在并发
因此,如上循环如果正常执行必然死循环。如果想不死循环,不block,肯定是异步或者多线程
答案
根据分析的结果就好想到解决办法了。
Web Worker
- Web Workfer是真正意义上的多线程,所以利用它就可以做到不阻止主线程
- IE逐步被Edge代替,而worker非IE浏览器下均得到完美支持,因此可以放开使用
//main.js
const worker = new Worker('worker.js');
worker.onmessage = function (e) {
// 接收worker传过来的数据
};
// worker.js
while (1) {
const n = Math.random();
console.log(n);
if (n > 0.9) {
postMessage(n);
break;
}
}
Concurrent.Thread.js库
如果不使用web worker,可以使用该库来模拟多线程。原理即是利用异步。
Concurrent.Thread.create(function () {
while (1) {
console.log(Math.random());
}
});
库链接-戳这里