0

我想制作一个 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但在这种情况下使用这些库不是一种选择。

4

1 回答 1

1

其中之一是制作一次可调用函数的好方法吗?

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

额外的做一个问题还是实际上更好?

在你的情况下,这是一个问题。查看已编译的 javascript。即使您更正了 indentation,也不是更好,因为它只是不必要地引入了另一个范围。

一种更好、更简约的方式可能是

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

(仍然不关心返回值)

于 2014-04-29T02:22:58.750 回答