5

IBM Developer Works の CPS (継続渡しスタイル) に関する記事のため、「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*
}

問題

関数の残りの部分でループが終了します。

解決策は何ですか?

4

2 に答える 2

7

継続渡しスタイルは、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); });
    }
}

setTimeout()(CPS の利点は、残りの実行を遅らせたり、ユーザー入力が処理されるのを待ったり、ブラウザが「遅いスクリプト」ポップアップを表示しないようにするためにいつでも使用できることです。)

于 2009-11-30T19:09:49.053 に答える
0

タイプミスがあります:

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

これはあなたが望んでいたものかもしれません:

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

それ以外では、 で何が起こるかなど、非常に少ない情報を提供するのはcontinuationtest困難です。これは、まだ問題が発生している場合に重要になる可能性があるためです。

于 2009-11-30T17:50:52.787 に答える