由于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*
}问题所在
循环在函数的其余部分结束。
解决方案是什么?
发布于 2009-12-01 03:09:49
延续传递风格不能很好地与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()来延迟rest的执行,或者等待处理用户输入,或者避免浏览器显示“慢脚本”弹出窗口。)
发布于 2009-12-01 01:50:53
你有一个打字错误:
function continuationtest(a) {
}
*use a*
*part 2*
}这可能是你想要的:
function continuationtest(a) {
*use a*
*part 2*
}除此之外,很难用这么少的信息来帮助你,比如continuationtest中会发生什么,因为如果你仍然有问题,这可能是至关重要的。
https://stackoverflow.com/questions/1821070
复制相似问题