由于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()
延迟其余部分的执行,或者等待处理用户输入,或者避免浏览器显示“慢脚本”弹出窗口。)