首先说函数调用,函数是如何被调用的?
函数在声明的时候其实就是在声明一个变量。例如:
function webFn(){
return \\\'Hello Word\\\'
}
上面这段代码在浏览器引擎解析时是这样的:
webFn = function(){
return \\\'Hello Word\\\'
}
Function 关键字后面跟的「webFn」其实是一个变量名。在词法分析的时候就会定义 webFn 这个变量,而调用这个函数的方法是用 () 一对括号来调用,一个简单的函数就这样执行了。
函数上下文和全局上下文
上下文的意思就是:当前的执行环境。我们知道了怎样调用函数,那函数是如何被引擎处理的呢?首先我们知道 JavaScript 的执行顺序是从上往下依次执行。
let a1 = 1;
function webFn(){
let a2 = 2;
return a1 + a2;
}
webFn();
这段代码一共 6 行,我们来分析这段代码的执行顺序。首先创建「全局上下文」,全局环境入栈。
执行到第 2 行的时候是一个函数,先声明,但不处理:
随后直接执行第 6 行,调用 webFn() 来创建一个新的上下文环境「函数执行上下文」。在内部是这样执行的:
初始的时候呢,只存在一个全局执行上下文,当你调用函数后,就出现了该函数执行上下文。指针是一直都在最顶栈的,所以会先执行最顶栈的代码。
入栈和出栈是什么意思
知道了上下文的关系,就容易理解出入栈的规矩了。栈嘛,先入后出。先执行全局环境,全局环境先入栈,随后又调用了函数,那函数也入栈了。如果函数内还有其他函数,那就会继续入栈。
那出栈的时候呢,JavaScript 是从上向下执行的,后进去的函数先出去,从栈顶到栈底的执行顺序。当前栈位置是由「指针」决定的,执行完当前函数,出栈销毁当前上下文环境后,指针会自动向下移动。「闭包除外,虽然指针移动,但变量不销毁」
什么是栈溢出?
如果代码中含有无限递归方法,就会一直有方法入栈,无限循环下去就导致了栈溢出,说白了就是栈太多,处理不过来了。
亲手体验一下栈的状态
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34539.html