如何在CoffeeScript中只执行一次函数

时间:2014-04-25 01:15:38

标签: javascript coffeescript functional-programming combinators

我想创建一个CoffeeScript函数,即使它被多次调用,它的效果只运行一次。

其中一种或其他方式是制作一次可调用功能的好方法吗?额外do是一个问题还是实际上更好?

once_maker_a = (f)-> 
  done=false
  ->
    f.call() unless done
    done=true

once_maker_b = (f)->
  do(done=false)-> 
    -> 
      f.call() unless done
      done=true

oa = once_maker_a(-> console.log 'yay A')
ob = once_maker_b(-> console.log 'yay B')

oa()
yay A      #runs the function passed to the once_maker
undefined  #return value of console.log
oa()
undefined  #look, does not reprint 'yay A'

ob()
yay B
undefined
ob()
undefined

我知道http://api.jquery.com/one/http://underscorejs.org/#once但在这种情况下使用这些库不是一种选择。

1 个答案:

答案 0 :(得分:1)

  

这是一种制作曾经可以调用的功能的好方法吗?

正如@UncleLaz在评论中所说,你忽略了该函数的任何参数。此外,您不会记住函数的返回值,并且始终只返回true。如果你真的只关心副作用,那么这可能不是问题。

  

额外是问题还是实际上更好?

在你的情况下,这是一个问题。 Check out the compiled javascript。即使你corrected the indentation,它也不是更好,因为它只是不必要地引入另一个范围。

更好,简约的方式可能是

once_maker = (f) ->
  -> 
    f?.apply this, arguments
    f = null

(仍然不关心返回值)