javascript - Javascript的调用栈和执行顺序
问题描述
我正在学习调用堆栈,我知道它是“先进后出”的顺序,但是为什么 JS 代码是按从上到下的顺序执行的呢?调用堆栈中的最后一项(即要弹出的第一项)不应该先执行吗?
解决方案
不用太技术化,想想下面的代码,
function squared(value) {
return value * value;
}
function cube(value) {
return squared(value) * value;
}
cube(3);
现在,当函数cube
被调用时,很明显,要让函数cube
返回它的计算值,它应该计算squared
first 的值并将返回值相乘。
这就是为什么总是先执行内部函数然后执行外部函数的原因,因为外部函数可能依赖于内部函数返回的值。
将其转换为堆栈,调用堆栈看起来像
- 初始空堆栈。
| |
--
- 当函数
cube
被调用时,它被插入到堆栈中。
|cube|
----
- 当函数
cube
调用函数squared
时,squared
被插入堆栈。
|squared|
| cube |
-------
squared
不再调用任何函数,因此函数squared
从堆栈中弹出,执行并返回值cube
|cube| //squared()
----
- 函数
cube
从堆栈中弹出,执行并将值返回给调用者。
| | // cube() * returned value from squared()
---
这几乎是一个非常简单的解释,为什么堆栈用于函数调用并且几乎用于所有编程语言。
推荐阅读
- c# - 在 Visual Studio 中运行 Docker Compose 时引发异常
- javascript - 有没有办法使用三元的条件作为值?
- android - 从以前的活动中检索字符串
- php - laravel 和 jwt:总是返回 Unauthorized
- python - 查找不包括测试用例的 Python 代码总行数
- spring - 为什么我得到异常 - 没有足够的变量可用于在 Spring Rest URI 调用中扩展?
- eclipse - 上传文件后在spring boot中刷新文件夹
- jquery - 验证完成后如何禁用验证器?
- ios - 如何使用 iOS sdk 在运行时更改 AWS 的区域?
- r - Duckworth-Lewis-Stern 计算器计算修正后的目标