我正在尝试编写一个调用函数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)
在无限循环中旋转。
答案 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