首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ES5中对递归匿名函数应用TCO(尾部调用优化

如何在ES5中对递归匿名函数应用TCO(尾部调用优化
EN

Stack Overflow用户
提问于 2016-09-19 05:23:59
回答 1查看 296关注 0票数 3

如果我可以tco一个命名的递归函数,应该有一种方法可以tco匿名递归function.If,下面是我的递归函数和TCO函数,请解释一下如何做到这一点。

代码语言:javascript
复制
function recursive(length, callback) {

    tco((function (i, sum) {
        var args = arguments;
        if (i > length) {
            console.log("break statement");
            callback(sum)
            return sum
        } else {
            return args.callee(i + 1, sum + i)
        }
    }))(0, 0)
}

function tco(f) {
    var value;
    var active = false;
    var accumulated = [];

    return function accumulator() {
        accumulated.push(arguments);

        if (!active) {
            active = true;

            while (accumulated.length) {
                value = f.apply(this, accumulated.shift());
            }

            active = false;

            return value;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-19 07:35:40

尾部调用优化

ES6建议对尾部呼叫系统进行更改,这是一种引擎优化。尾部调用是指当一个函数作为另一个函数的最后一个语句被调用时,如下所示:

代码语言:javascript
复制
function doSomething() {
    return doSomethingElse();   // tail call
}

ECMAScript 6试图减少严格模式下某些尾部调用的调用堆栈的大小。通过这种优化,只要满足以下条件,就会清除并重用当前堆栈帧,而不是为尾部调用创建新的堆栈帧。

必须打开

  1. 严格模式。
  2. 尾部调用不需要访问当前堆栈帧中的变量(表示函数不是闭包)。
  3. 进行尾部调用的函数在尾部调用返回后没有进一步的工作要做。
  4. 尾部调用的结果将作为函数值返回。

也许最难避免的情况是使用闭包。因为闭包可以访问包含范围内的变量,所以尾部调用优化可能会被关闭。例如:

代码语言:javascript
复制
"use strict";

function doSomething() {
    var num = 1,
        func = () => num;

    // not optimized - function is a closure
    return func();
}

利用TCO优化:

考虑这个函数,它计算阶乘:

代码语言:javascript
复制
"use strict";
function factorial(n) {

    if (n <= 1) {
        return 1;
    } else {

        // not optimized - must multiply after returning
        return n * factorial(n - 1);
    }
}

为了优化函数,您需要确保乘法不会在最后一次函数调用之后发生。

代码语言:javascript
复制
"use strict";
function factorial(n, p = 1) {

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

        // optimized
        return factorial(n - 1, result);
    }
}

来源: Nicholas Zakas写的一本令人敬畏的书,Understanding ECMAScript 6。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39562817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档