以下代码定义了两个函数linescircles,它们分别返回一个函数fg。函数fg只是为了简单起见才等于(() -> size),但通常它们是变量size的不同函数。

lines = () ->
    size = 10 # default value
    f = () -> size
    f.size = (_) ->
      size = _
      f
    f

circles = () ->
    size = 15 # default value
    g = () -> size
    g.size = (_) ->
      size = _
      g
    g


在控制台上,上面的代码基于以下模式,这是我需要的:

> lines()() # 10
> lines().size(20)() # 20
> circles()() # 15
> circles().size(30)() #30


您可能会注意到,f.sizeg.size方法是闭包,并且在linescircles上它们都是相同的。然后我的问题是:如何避免重复size方法的代码? (使用coffeescript或javascript)

我尝试了不同的解决方案,但没有找到正确的方法。为了复制闭包,在size方法内的size变量应引用在size的第一行定义的lines变量(对circles相同)。

最佳答案

您不能在代码中使用辅助函数,因为那样将无法按预期方式访问闭包变量。但是,您可以将整个代码包装在一个函数中,以便它分别返回linescircles函数:

make = (def, accessor) ->
    () ->
        size = def
        f = () -> accessor size
        f.size = (_) ->
           size = _
           f
        f

lines = make 10, (size) -> size
circles = make 15, (size) -> size

关于javascript - 闭包和CoffeeScript的作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28670514/

10-12 12:16
查看更多