我想创建一个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但在这种情况下使用这些库不是一种选择。
答案 0 :(得分:1)
这是一种制作曾经可以调用的功能的好方法吗?
正如@UncleLaz在评论中所说,你忽略了该函数的任何参数。此外,您不会记住函数的返回值,并且始终只返回true
。如果你真的只关心副作用,那么这可能不是问题。
额外是问题还是实际上更好?
在你的情况下,这是一个问题。 Check out the compiled javascript。即使你corrected the indentation,它也不是更好,因为它只是不必要地引入另一个范围。
更好,简约的方式可能是
once_maker = (f) ->
->
f?.apply this, arguments
f = null
(仍然不关心返回值)