由于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*
}
问题
循环以函数的其余部分结束。
解决方案是什么?
答案 0 :(得分: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()
来延迟执行其余操作,或者等待处理用户输入,或者避免浏览器显示“慢速脚本”弹出窗口。 )
答案 1 :(得分:0)
你有一个错字:
function continuationtest(a) {
}
*use a*
*part 2*
}
这可能是你想要的:
function continuationtest(a) {
*use a*
*part 2*
}
除此之外,很难提供如此少的信息,例如continuationtest
中会发生的事情,因为如果您仍然遇到问题,这可能是至关重要的。