Call stack(调用栈) - 术语表 编辑
调用栈是解释器(比如浏览器中的 JavaScript 解释器)追踪函数执行流的一种机制。当执行环境中调用了多个函数时,通过这种机制,我们能够追踪到哪个函数正在执行,执行的函数体中又调用了哪个函数。
- 每调用一个函数,解释器就会把该函数添加进调用栈并开始执行。
- 正在调用栈中执行的函数还调用了其它函数,那么新函数也将会被添加进调用栈,一旦这个函数被调用,便会立即执行。
- 当前函数执行完毕后,解释器将其清出调用栈,继续执行当前执行环境下的剩余的代码。
- 当分配的调用栈空间被占满时,会引发“堆栈溢出”错误。
function greeting() {
// [1] Some codes here
sayHi();
// [2] Some codes here
}
function sayHi() {
return "Hi!";
}
// 调用 `greeting` 函数
greeting();
// [3] Some codes here
上面的代码会按照如下流程这样执行:
- 忽略前面所有函数,直到
greeting()
函数被调用。 - 把
greeting()
添加进调用栈列表。 - 执行
greeting()
函数体中的所有代码。调用栈列表: - greeting
- 代码执行到
sayHi()
时,该函数被调用。 - 把
sayHi()
添加进调用栈列表。 - 执行
sayHi()
函数体中的代码,直到全部执行完毕。调用栈列表: - sayHi - greeting
- 返回来继续执行
greeting()
函数体中sayHi()
后面的代码。 - 删除调用栈列表中的
sayHi()
函数。 - 当
greeting()
函数体中的代码全部执行完毕,返回到调用greeting()
的代码行,继续执行剩下的 JS 代码。调用栈列表: - greeting
- 删除调用栈列表中的
greeting()
函数。
一开始,我们得到一个空空如也的调用栈。随后,每当有函数被调用都会自动地添加进调用栈,执行完函数体中的代码后,调用栈又会自动地移除这个函数。最后,我们又得到了一个空空如也的调用栈。
了解更多
基础知识
- Wikipedia 上的 调用栈
- MDN Web 文档中的术语
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论