由于an article in IBM Developer Works about CPS (continuation passing style),我试图不使用“return”。

没有CPS

function getter() {
    * calculate a*
    return a;
}
function test() {
    *part 1*
    if(*condition*) {
         a = getter();
    }
    *use a*
    *part 2*
}

过渡

其余功能
    }
    *use a*
    *part 2*

使用CPS
function getter() {
    * calculate a*
    continuationtest(a);
}
function test() {
    *part 1*
    if (*condition*) {
        getter();
}
function continuationtest(a) {
    }
    *use a*
    *part 2*
}

问题

循环在函数的其余部分结束。

解决办法是什么?

最佳答案

连续传递样式不能与JavaScript循环很好地结合使用。您需要找到另一种执行循环的方法。

请注意,您的代码将按以下方式进行解释:

function test() {
    *part 1*
    if (*condition*) {
        getter();
    }                               // <--- note indentation here
    function continuationtest(a) {  // <--- and here
    }
    *use a*
    *part 2*
}

因此,您目前根本没有使用延续传递样式。当getter()调用continuationtest()时,可能会失败,因为continuationtest()不在此范围内。

带有循环的CPS示例可能看起来像这样。

(不含CPS)
function doSomething(i) {
    alert("doing " + i);
}

function doLoop() {
    for (i = 0; i < 9; i++)
        doSomething(i);
}

使用CPS
function doSomething(i, ctn) {
    alert("doing " + i);
    ctn();
}

function doLoop() {
    doLoopStartingAt(0);

    function doLoopStartingAt(i) {
        if (i < 9)
            doSomething(i, function ctn() { doLoopStartingAt(i + 1); });
    }
}

(CPS的优点是,您可以随时使用setTimeout()延迟其余部分的执行,或者等待处理用户输入,或者避免浏览器显示“慢脚本”弹出窗口。)

10-04 18:31