图解尾调用优化尾调用啥是尾调用?尾调用就是函数的最后一个步骤调用另一个函数比方说:函数在调用的时候会在调用栈中 push 一个调用帧,每次执行完函数都会逐一弹出调用帧知道所有函数执行完毕,调用栈被清空:调用栈中的同步代码function f1() { console.log(’????’) }function f2() { f1() }function f3() { f2() }f3()调用栈如下图:首先执行 script ,将 main 主程序推入调用栈中并执行,发现需要调用 f3将 f3 函数推入调用栈中,执行 f3,发现需要调用 f2将 f2 函数推入调用栈中,执行 f2, 发现需要调用 f1将 f1 推入调用栈中,执行 f1,发现需要调用 console.log 方法推入 console.log 并打印结果执行完毕弹出 consoole.log弹出 f1弹出 f2弹出 f3弹出 main,代码执行完毕调用栈中的异步代码以 setTimeout 为例:console.log(‘1’)setTimeout(function() { console.log(‘3)}, 5000)console.log(‘2’)调用栈见下图:执行代码推入 script 代码 main 并执行,发现需要执行 console.log将 console.log 推入调用栈执行 console.log 打印 1 弹出调用栈发现 setTimeout 将等待执行的回调函数推入宏任务列表,将 setTimeout 弹出调用栈继续执行代码发现需要执行 console.log 将任务推入调用栈执行 console.log 打印 2 并弹出调用栈script 代码 main 执行完毕,弹出调用栈同步代码执行完毕,查看宏任务列表发现需要执行 console.log延迟 5s 将 console.log 推入调用栈执行 console.log 并打印 2最后将 console.log 弹出调用栈,代码执行完毕尾调用优化每次在函数被调用的时候,内存都会保存调用帧。尾调用因为是函数的最后一步,因此并不需要外层函数的调用帧。我们只需要将最后需要执行另外一个函数之前用 return 操作符显式表明"不再需要此函数"即可beforeafter注意必须使用严格模式在执行过程中,调用栈的调用帧永远只有一条,这样就可以节省很大一部分内存参考:https://vaibhavgupta.me/2018/…http://www.ruanyifeng.com/blo...https://juejin.im/post/5acdd7…