首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript CPS (延续传递风格)实现

Javascript CPS (延续传递风格)实现
EN

Stack Overflow用户
提问于 2009-12-01 01:02:21
回答 2查看 2.1K关注 0票数 5

由于an article in IBM Developer Works about CPS (continuation passing style)的原因,我尽量不使用"return“。

没有CPS

代码语言:javascript
复制
function getter() {
    * calculate a*
    return a;
}
function test() {
    *part 1*
    if(*condition*) {
         a = getter();
    }
    *use a*
    *part 2*
}

过渡

函数的其余部分

代码语言:javascript
复制
    }
    *use a*
    *part 2*

使用CPS

代码语言:javascript
复制
function getter() {
    * calculate a*
    continuationtest(a);
}
function test() {
    *part 1*
    if (*condition*) {
        getter();
}
function continuationtest(a) {
    }
    *use a*
    *part 2*
}

问题所在

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

解决方案是什么?

EN

回答 2

Stack Overflow用户

发布于 2009-12-01 03:09:49

延续传递风格不能很好地与JavaScript循环混合。你需要找到另一种方法来做这个循环。

请注意,您的代码是这样解释的:

代码语言: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的

代码语言:javascript
复制
function doSomething(i) {
    alert("doing " + i);
}

function doLoop() {
    for (i = 0; i < 9; i++)
        doSomething(i);
}

带CPS

代码语言:javascript
复制
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的执行,或者等待处理用户输入,或者避免浏览器显示“慢脚本”弹出窗口。)

票数 7
EN

Stack Overflow用户

发布于 2009-12-01 01:50:53

你有一个打字错误:

代码语言:javascript
复制
function continuationtest(a) {
    }
    *use a*
    *part 2*
}

这可能是你想要的:

代码语言:javascript
复制
function continuationtest(a) {
    *use a*
    *part 2*
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1821070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档