不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论:
javascript是按照语句出现的顺序执行的,看到这里读者要打人了:我难道不知道js是一行一行执行的?还用你说?稍安勿躁,正因为js是一行一行执行的,所以我们以为js都是这样的:
运行的最终结果是132,为什么结果不是23呢?
下面我们来分析一下代码运行的入栈和出栈的过程;
首先当调用函数bar()时,此函数就会先入栈,执行console.log(1);
由上图可知:控制台先打印出结果1,执行完毕之后在出栈。 再执行函数bar内部的函数foo,于是函数foo也入栈了。
执行函数foo的内部代码,调用函数 ,于是函数par()也要入栈。
由于函数par()内部执行异步函数setTimeout(),异步函数则会由浏览器内核timer模块来处理
接着在执行par函数中的console.log(3),控制台打印结果为3 ,此时栈的代码执行完毕后,会按照栈的特点进行先进后出,后进先出顺序进行出帐顺序:先函数par()----》后函数foo() ------》最后函数bar