2014-05-20 87 views
0

我試圖編寫一個函數,doAndRepeatUntil調用函數f,直到謂詞/條件pred爲真。執行函數,直到謂詞滿足

在下面的代碼中,我期望@sum從0開始,然後打印10, 20, ..., 90, 100然後終止。

doAndRepeatUntil = (f, pred) -> 
    console.log @sum 
    f() until pred() 

@sum = 0 

f = -> 
    @sum += 10 

pred = -> 
    @sum >= 100 

console.log f() # NaN 

doAndRepeatUntil(f, pred) # infinite loop 

但是,我看到f()打印出來NaN。並且doAndRepeatUntil(f,pred)旋轉無限循環。

+1

你確定'@'是你認爲它在任何地方你使用它? –

+0

不,我不明顯 –

回答

3

由於mu is too short在他的評論中暗示,@sum在每個函數中都有不同的this上下文。如果你的情況允許,我會在函數之前定義sum,以便它們都在範圍內(jsfiddle)。

sum = 0 

doAndRepeatUntil = (f, pred) -> 
    console.log sum 
    f() until pred() 

f = -> 
    console.log 'f', sum 
    sum += 10 

pred = -> 
    console.log 'pred', sum 
    sum >= 100 

doAndRepeatUntil f, pred # infinite loop 

如果你需要保持@sum,那麼你就需要使用脂肪箭頭的功能(jsfiddle)。

@sum = 0 

doAndRepeatUntil = (f, pred) => 
    console.log @sum 
    f() until pred() 

f = => 
    console.log 'f', @sum 
    @sum += 10 

pred = => 
    console.log 'pred', @sum 
    @sum >= 100 

doAndRepeatUntil f, pred # infinite loop 
+0

你也可以使用'f.sum = 0'和'f.pred = - > ...'作爲一個簡單的方法來收集部分在一起(記住你可以附加屬性幾乎任何你想要的(Coffee | Java)腳本)。或者創建一個快速課程,將'sum','f'和'pred'收集到一個包中。 –