每次当控制器转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。
JavaScript中的运行环境大概包括三种情况:
1.全局环境:JavaScript代码运行起来会首先进入该环境
2.函数环境:当函数被调用执行时,会进入当前函数中执行代码
3.eval(不建议使用,可忽略)
因此在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript引擎会以栈的方式来处理他们,这个栈,我们称其为函数调用栈(call stack),栈底永远是全局上下文,栈顶就是当前正在执行的上下文。
执行上下文可以理解为函数执行的环境,每一个函数执行时,都会给对应的函数创建这样一个执行环境。
【注】:函数中,遇到return能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。
【小结】:
1.单线程
2.同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待
3.全局上下文只有唯一的一个,它在浏览器关闭时出栈
4.函数的执行上下文的个数没有限制
5.每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。
首先全局作用域入栈,在var result = f1()时,f1()入栈,开始调用f1(),f1出栈,虽然f2在f1中,但没有被调用所以不会产生新的执行环境,f1出栈之后,return f2,然后赋值给result,下面的result()其实就是f2()。