美文网首页
【ES6 笔记】函数:尾调用优化

【ES6 笔记】函数:尾调用优化

作者: ___Jing___ | 来源:发表于2018-10-30 11:43 被阅读0次

尾调用优化是ES6中在系统引擎优化上做的一个改进

概念:尾调用指的是函数作为另一个函数的最后一条语句被调用

function doSomething(){
  return doSomethingElse();
};

问题:在ES5中,尾调用的实现与其他函数调用实现类似:创建一个新的栈帧(stack frame),将其推入调用栈来表示函数调用。也就是说,在循环调用中,每一个未用完的栈帧都会被保存在内存中,当调用栈变得过大时会造成程序问题,也就是我们常说的栈溢出(stack overflow)。

ES6中的尾调用优化

如果满足以下条件,尾调用不再创建新的栈帧,而是清除并重用当前栈帧。

  • 尾调用不访问当前栈帧的变量(也就是说函数不是一个闭包);
  • 在函数内部,尾调用是最后一条语句;
  • 尾调用的结果作为函数值返回;

合格示例:

function doSomething(){
  return doSomethingElse();
};

以下是反面教材:

function doSomething(){
  doSomethingElse(); //没有返回
};
function doSomething(){
  return 1+doSomethingElse(); //返回值后还需要做其他操作
};
function doSomething(){
  const result = doSomethingElse(); //函数调用不在尾部
  return result;
};
function doSomething(){
  const num = 1;
  const func = () => num //这是一个闭包函数,函数func需要访问局部变量num
  return func();
};

如何利用尾调用优化

一般我们在优化函数的时候可能会用到尾调用优化,最常用的场景是在使用递归的时候:

function factorial(n){
  if(n<=1){
    return 1;
  }else{
    return n*factorial(n-1); // 无法优化,函数返回后还需要再执行乘法操作
  }
}

优化后:

function factorial( n, p=1 ){
  if(n<=1){
    return 1*p;
  }else{
    let result = n*p
    return factorial(n-1, result);
  }
}

相关文章

  • 【ES6 笔记】函数:尾调用优化

    尾调用优化是ES6中在系统引擎优化上做的一个改进 概念:尾调用指的是函数作为另一个函数的最后一条语句被调用 问题:...

  • ES6中的尾调优化

    前言 在ES6的引擎优化中,改变了尾调用系统。尾调用:当一个函数的最后一个动作是返回一个函数的调用结果。——维基百...

  • 关于ES6尾调用优化

    ES6包含了一个性能领域的特殊要求。这与一个涉及函数调用的特定优化形式相关:即尾调用优化(Tail Call Op...

  • 尾递归优化

    “尾递归优化”的含义是:如果递归函数属于尾递归,那么运行时会优化其调用过程。优化主要针对调用栈,将多层调用,转化为...

  • 尾调用优化

    什么是尾调用优化? 尾调用优化是指你可以避免重新分配给一个函数新的堆栈因为正在调用的函数会简单的返回它从已经调用过...

  • 什么是尾调用?什么是尾递归?尾调用的优化?尾递归优化?

    尾调用优化 尾递归(尾调用优化)

  • ES6 函数的扩展

    函数的扩展我们可以从三个方面来了解与认识: 参数的默认值 箭头函数 关于尾调用的优化 参数的默认值 在 ES6 之...

  • ES6 函数的扩展

    函数的扩展我们可以从三个方面来了解与认识: 参数的默认值 箭头函数 关于尾调用的优化 参数的默认值 在 ES6 之...

  • Kotlin语言(九):特性

    1、尾递归优化 尾递归:函数在调用自己之后没有再执行其他任何操作就是尾递归 尾递归优化的原理就是将递归转换成迭代,...

  • es6尾调用优化

    es6 严格模式下(非严格模式不受影响),满足一下三个条件,尾调用不再创建新的stack frame ,而是重用当...

网友评论

      本文标题:【ES6 笔记】函数:尾调用优化

      本文链接:https://www.haomeiwen.com/subject/ukawtqtx.html