|  |      1lxk11153      2020-07-30 22:20:59 +08:00 难道不是 return 吗? | 
|  |      2Mistwave      2020-07-30 22:32:49 +08:00 via iPhone return | 
|  |      3BingoXuan      2020-07-30 22:42:19 +08:00 via Android 为什么要抛出异常? return 就是让你回到父函数,递归回去不就是回去开头吗? 蛇尾即是蛇头 | 
|  |      4rioshikelong121 OP | 
|  |      5ipwx      2020-07-30 23:10:38 +08:00 | 
|      6ChanKc      2020-07-30 23:14:38 +08:00 如果异常一下子就退掉整个栈……异常栈怎么办?你调递归的那个函数是不是也会被退出? | 
|  |      7rioshikelong121 OP @ChanKc 比如说。我写的函数 A 里面定义并且调用了 B 。B 递归调用自身并修改 A 闭包里面的变量。等到合适的时机抛出异常。A 里面 try catch 调用 B 。 我的理解是 Call Stack 里面只会清除掉由 B 递归调用产生的上下文。不会把 A 的调用也清掉。。。 | 
|  |      8rioshikelong121 OP @ipwx 我还以为异常不需要逐层返回。而是会直接返回到捕获处或者顶层。。  如果是这样那确实没必要。 | 
|  |      9secondwtq      2020-07-30 23:26:18 +08:00 一般是每次递归调用后检查一下是不是有结果了,有了就顺便返回。 楼主这异常运用灵活自如,想必以前是学 Python 的吧。 | 
|      10wzzzx      2020-07-30 23:41:56 +08:00 很明显,你写的递归有问题 | 
|  |      11BingoXuan      2020-07-30 23:46:30 +08:00 via Android @rioshikelong121  你 debug 时候看到调用栈就是调试器一路往回捕获的结果。直接 return 就好了 如果用 c 就可以很暴力用 goto 跳转了,但 js 和 Python 这些动态语言就不行了。 | 
|      14Austaras      2020-07-31 00:33:48 +08:00 等一个独立自主发明 first class continuation, 看好你哟 | 
|      15ChanKc      2020-07-31 08:14:21 +08:00 via Android #7 那不是也要每一层去找 catch 吗 | 
|  |      1612tall      2020-07-31 08:39:25 +08:00 @rioshikelong121 可以了解一下尾递归 | 
|  |      17lithbitren      2020-07-31 11:23:12 +08:00 把递归用栈或队列存储存参数,然后改成迭代就可以提前结束了。 | 
|  |      18ipwx      2020-07-31 12:24:30 +08:00 @rioshikelong121 你想一下啊,每个函数都有局部变量对吧。就算你没有 try ... catch ... ,局部变量的内存总得回收吧?调用栈的项目都得删掉吧?你 return 也不过就干了这两件事情吧?所以 throw 直接跳到顶层,只是写法上更省而已,执行过程不会省的。 | 
|  |      19chnwillliu      2020-08-07 06:55:32 +08:00 难道不是依赖 js 引擎的尾调用优化? 可惜 chrome 貌似还没优化。 http://kangax.github.io/compat-table/es6/#test-proper_tail_calls_%28tail_call_optimisation%29 |