前端面经每日一题Day18
为什么javascript是单线程?与异步有冲突吗?
- 简化并发问题。多线程设计复杂的线程同步问题,比如竞态和死锁等。JavaScript的单线程就可以避免这些问题,减低代码的复杂性和可维护性。
- 避免浏览器环境限制。最开始JavaScript是在浏览器开发,浏览器环境存在很多限制,多线程可能会增加浏览器的复杂度和资源消耗。
- 保持DOM的一致性。多线程下,不同线程同时操作相同的DOM可能会导致数据竞争和不一致
没有冲突。JavaScript通过事件循环实现了异步编程,允许在等待某些操作如网络请求,可以继续执行代码的其他部分,使得JavaScript在保持单线程的同时,高效处理多任务,“伪多线程”。
JavaScript事件循环机制包括事件队列和JavaScript引擎。异步任务完成后会被添加到事件队列中,JavaScript引擎不断从事件队列中取出任务并执行,实现了异步编程。
同步和异步的区别
Synchronous同步:顺序完成,阻塞。代码运行过程中,从上到下逐步运行代码,每一部分代码运行完成之后,下面代码才会运行
Asynchronous异步:并发,非阻塞,复杂性高。一些代码在执行的时候不会影响到其他代码的执行,即我们不需要等代码执行完才可以执行之后的代码。
延时和异步的区别
延时:延时会导致当前线程或任务的暂停执行,直到指定的时间间隔结束。但不会改变程序执行的顺序。实现方法:setTimeout
或setInterval
异步:在执行某个任务时,不需要等待该任务完成就继续执行后续的任务。通过回调函数、Promise机制实现。