搜索
JavaScript函数栈问题
天蓬老师
天蓬老师 2017-04-10 15:46:20
[JavaScript讨论组]

上面的代码该如何理解?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
高洛峰
+--------------+                                       
|              |  i = -1                               
|      f(-1)   +------------------------------+        
|              |                              |        
+-------+------+                              |        
        |                                     | return;
        |                                     |        
+-------+------+                              |        
|              |  i = n                       |        
|      f(n)    | <----------------------------v        
|              |                                       
+-------+------+                                       
        |                                              
        |                                              
+-------+------+                                       
|              |  i = 2                                
|     f(2)     |                                       
|              |                                       
+-------+------+                                       
        |                                              
        |                                              
+-------+------+                                       
|              |  i = 3                                
|     f(3)     |                                       
|              |                                       
+--------------+        

前提知识:

在函数内部调用另外一个函数,会在该函数上方形成一个call frame,用于保存变量和相关调用位置,其实理解MDN上的这个场景,只要理解上面这个图就可以了(图画的简单了一些,ascii画出来的,有点虐~)

这里的N个call frame就形成了调用栈,即call stack

何时销毁:

那么,这个call frame什么时候销毁?就是当上层frame执行到return的时候。
这个时候上层frame将结果返回给下层,下层继续执行,执行完后return到下面的frame,然后销毁。
依次类推。

破题:

所以,当f(-1)执行到return的时候,他下方的f(0) frame保存的i的值为0,然后从document.writeln这里继续往下执行。

大家讲道理

foo(3)
输出begin:3
执行foo(2)
输出begin:2
执行foo(1)
输出begin:1
执行foo(0)
输出begin:0
执行foo(-1)
i<0
返回
返回到执行完foo(0) 输出end:0
返回到执行完foo(1) 输出end:1
返回到执行完foo(2) 输出end:2
返回到执行完foo(3) 输出end:3

递归

高洛峰

这个不就是递归调用吗?
foo(3) 这里开始执行
实际上一共执行了4次
查查递归调用吧

巴扎黑

我猜你是对return有点迷糊,return一执行,函数就不再执行了。

PHP中文网

栈是先进后出的,就是0,1,2,3的顺序进去了,那就3,2,1,0的顺序出了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号