同步模式指的就是我们代码中的程序依次执行,后面的任务必须要等到前面的程序执行完成后才能开始执行。程序的执行顺序和我们代码的编写顺序是完全一致的,也就是说这种方式比较简单。在单线程情况下,我们大多数任务都会以同步模式执行。
这里的同步执行并不是同时执行而是排队执行,JS执行引擎会把整体的代码全部加载进来,然后在调用栈中压入一个匿名的调用。
这个匿名的调用就可以理解为把全部的代码,放到一个匿名函数当中去执行。然后就去逐行执行这个匿名函数中的每一行代码,首先依次进行压入调用栈-执行代码-执行完毕弹出调用栈这样的执行流程。如果执行到声明代码,不管是函数声明还是变量声明,都不会产生任何的调用。遇到函数调用
fn()会把函数压入调用栈,然后执行这个函数,执行完毕弹出调用栈。等到整体代码执行完毕,就会清空整个调用栈。
这里的调用栈只是一个更专业的说法,更通俗的解释就是JS在执行引擎当中维护了一个正在工作的工作表或者说正在执行的一个工作表。在这个里面会记录当前我们正在做的一些事情,当这个工作表中所有的任务全部被清空过后,这轮工作就算是结束了。这是一个在纯同步模式下的执行情况,所以说特别容易理解。以为它整个执行过程,非常复合我们正常的阅读逻辑或者说思考逻辑。不过这种排队执行的机制也存在一种很严重的问题,就是如果其中某一个任务或者更具体点说其中的一行代码,执行时间过长它后面的任务就会被延迟。我们把这种延迟成为阻塞,这种阻塞对用户而言,意味着界面会有卡顿。所以就必须要有异步模式来解决程序当中那些无法避免的耗时操作。