21. 什么是尾调用,使用尾调用有什么好处?

2023-02-15  本文已影响0人  Angle_Ch

一、什么是尾调用

尾调用指的是函数的最后一步调用另一个函数。

如下所示为尾调用:

function f(x) {
    return g(x)
}

function b(num) {
  return c(num + 2)
}

下面的两种情况都不属于尾调用:

function f(x){
    let y = g(x)
    return y
}
function f(x){
    return g(x) + 1
}

二、为什么说尾调用的性能要比没有使用尾调用的性能好呢?

代码执行是基于执行栈的,所以当在一个函数里调用另一个函数时,会保留当前的执行上下文,然后再新建另外一个执行上下文加入栈中。

使用尾调用的话,因为已经是函数的最后一步,所以这时可以不必再保留当前的执行上下文,从而节省了内存,这就是尾调用优化。

但是 ES6 的尾调用优化只在严格模式下开启,正常模式是无效的。

三、尾递归

函数调用自身,叫做递归。如果尾调用自身,则就称为尾递归。

递归非常消耗内存,因为需要同时保存成千上万个调用记录,很容易发生栈溢出的错误。

但是对于尾递归来说,由于只存在一个调用记录,所以永远不会发生栈溢出。

function factorial(n) {
  if (n === 1) return 1
  return n * factorial(n - 1)
}

console.log(factorial(5)) //120
function factorial(n, total) {
  if (n === 1) return total
  return factorial(n - 1, total * n)
}

console.log(factorial(5, 1))

参考地址:https://blog.csdn.net/weixin_47450807/article/details/123396329

上一篇 下一篇

猜你喜欢

热点阅读