【问题标题】:How do I execute a function only once in CoffeeScript如何在 CoffeeScript 中只执行一次函数
【发布时间】:2014-04-25 01:15:38
【问题描述】:

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

【问题讨论】:

  • Underscore implementation 非常接近您的 once_maker_a,除非您不处理 f 的返回值。
  • 这里唯一缺少的是处理传递给原始函数的参数和返回值。除此之外,你有一个相当合理的实现。
  • 原来的缩进问题没有了,但是在do(done=false)下缩进失败->

标签: javascript coffeescript functional-programming combinators


【解决方案1】:

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

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

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

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

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

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

(还是不关心返回值)

【讨论】:

  • 哇,是的,压痕是我偷偷摸摸的。您对额外范围的看法是正确的,而代码高尔夫的标准杆因您的优雅回答而下降了一个档次。谢谢:)
  • 是的,代码打高尔夫球很好,但对于真正可读的代码,我认为f.apply this, arguments unless f == null 方法更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多