2009-11-30 108 views
5

由于an article in IBM Developer Works about CPS (continuation passing style),我试图不使用“返回”。Javascript CPS(延续传球风格)执行

没有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* 
} 

问题

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

解决方案是什么?

回答

0

你有一个错字:

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

这可能是你想要的东西:

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

除此之外,这将是很难帮助这么少的信息,如会发生什么在continuationtest,因为如果你仍然有问题,这可能是至关重要的。

6

继续传递样式不能很好地与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()耽误休息的执行,或等待用户输入进行处理,或避免浏览器显示“慢脚本”弹出窗口。)