以下代码定义了两个函数lines
和circles
,它们分别返回一个函数f
和g
。函数f
和g
只是为了简单起见才等于(() -> 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.size
和g.size
方法是闭包,并且在lines
和circles
上它们都是相同的。然后我的问题是:如何避免重复size
方法的代码? (使用coffeescript或javascript)我尝试了不同的解决方案,但没有找到正确的方法。为了复制闭包,在
size
方法内的size
变量应引用在size
的第一行定义的lines
变量(对circles
相同)。 最佳答案
您不能在代码中使用辅助函数,因为那样将无法按预期方式访问闭包变量。但是,您可以将整个代码包装在一个函数中,以便它分别返回lines
或circles
函数:
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/