5

由于IBM Developer Works 中有一篇关于 CPS (continuation pass 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*
}

问题

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

解决办法是什么?

4

2 回答 2

7

延续传递风格不能很好地与 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()延迟执行其余部分,或等待处理用户输入,或避免浏览器显示“慢脚本”弹出窗口。)

于 2009-11-30T19:09:49.053 回答
0

你有一个错字:

function continuationtest(a) {
    }
    *use a*
    *part 2*
}

这可能是你想要的:

function continuationtest(a) {
    *use a*
    *part 2*
}

除此之外,很难用这么少的信息提供帮助,例如在 中会发生什么continuationtest,因为如果您仍然遇到问题,这可能是至关重要的。

于 2009-11-30T17:50:52.787 回答