2009-11-30 60 views
5

由於an article in IBM Developer Works about CPS (continuation passing style),我試圖不使用「返回」。Javascript CPS(延續傳球風格)執行

沒有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

你有一個錯字:

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

這可能是你想要的東西:

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

除此之外,這將是很難幫助這麼少的信息,如會發生什麼在continuationtest,因爲如果你仍然有問題,這可能是至關重要的。

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()耽誤休息的執行,或等待用戶輸入進行處理,或避免瀏覽器顯示「慢腳本」彈出窗口。)