2011-04-25 76 views
1

編輯:這個問題是misexpressed。我真正想問的是:需要同步編程

有沒有什麼不能用OO語言(支持閉包)使用持續傳遞的風格?

你可以谷歌什麼CPS的意思或只是堅持定義的函數/方法永不返回任何東西,總是推動數據的地方 - 使用傳遞的回調。

從原來的問題來看,我甚至可以回答自己 - 沒有像那樣的東西。而且它實際上是非常好的OO原則稱爲告訴不要問

function getName(){ 
    return this.name; 
} 

console.log(xyz.getName()) 

function pushNameTo(callback){ 
    callback(this.name); 
} 

xyz.pushNameTo(console.log) 

好,但是這一次是如何做的事情而得名,讓名它後它做什麼,並使其更多OO:

function renderOn(responseBuilder){ 
    var b = responseBuilder; 

    //or just string, whatever, depending on your builder implementation 
    b.field("Name: ", this.name); 
    b.field("Age: ", this.age); 
    b.image("Profile photo", this.imageData); 
} 

person.renderOn(htmlBuilder); 

這裏的要點是 - 對象不僅包含其數據,而且包含行爲,精神,個性。 還有誰應該負責表達人的表達而不是人本身?

當然,這並不一定意味着你必須在HTML代碼,構建服務於這個目的。它甚至可以爲實際的UI渲染層生成一些xml或其他數據格式。但它總是推而不是拉。

+1

函數式編程語言基於這個原理,所以答案顯然是* nothing *。 – deceze 2011-04-25 23:30:50

+0

是的,我已經完全錯過了這個事實,thx :) – 2011-04-25 23:37:23

+0

@deceze:JavaScript是如何與**功能**編程語言相關的? – zerkms 2011-04-25 23:39:15

回答

3

沒什麼,當然。考慮一下:如果你有一個完全順序的程序,你可以簡單地將它插入到某種包裝中,比如document.onload()。然後順序程序將異步啓動。

反過來說,如果你擁有的只是一種同步語言,你總是可以通過使用一個片段表來執行異步處理,而內部循環則可以看到已經啓用了什麼,它從表中執行。實際上,這看起來非常像您的JavaScript運行時的底層運行時。

+1

+1:我會停止輸入我的回覆:) – 2011-04-25 23:26:50

0

有兩種類型的程序 - 強制性和功能性。

勢在必行程序sequantial - 一個又一個的一步。例如C++,Java等。

功能程序可能不是連續的。大多數異步模式使用「連續式」編程,這是一種具有必要泛音的功能性編程。

JavaScript是具有一流的功能,即它也使某些官能編程範例命令式語言。你在你的問題中所述什麼

是「延續風格的」異步編程。請注意,「繼續」的含義是「該行之後的其餘程序」。因此,從理論上講,每個命令式程序都可以用「連續」式(即從第二行開始繼續執行其餘程序的第一行,等等)重寫。例如:

Statement #1 
Statement #2 
Statement #3 

可以被改寫爲:

do(Statement #1, function{ 
    do(Statement #2, function{ 
    Statement #3 
    }) 
}) 

哪裏do的第二個參數是聲明的延續。

雖然循環更加棘手,但它們也可以被類似地重寫 - 本質上是通過循環體itsslef作爲延續。