替代在CoffeeScript中的匿名函数中包装所有回调函数

时间:2015-10-17 17:10:02

标签: coffeescript

我今天开始使用CoffeeScript,当我需要回调函数时,发现自己使用了(args...) => @style(args...)这样的模式。上下文大致如下:

class Parent
  @style: (feature) ->
    if feature
      @insight()

class Child extends Parent
  @insight: ->
    alert 'Sara is awesome'

  @load: ->
    [42].forEach((args...) => @style(args...))

Child.load()

这显示Sara is awesome,这是准确的。如果我只使用了[42].forEach(@style),那么style最终会引用一个this引用父类(我认为?),它不知道insight

但这非常冗长,我的代码中需要很多回调函数。是否有更优雅,惯用的方法来解决这个问题?

(在CoffeeScript中使用forEach是我读过的糟糕的风格,但在我的实际代码中,我正在使用各种Leaflet函数,我不能用for循环替换它。)

1 个答案:

答案 0 :(得分:2)

首先要注意的是,您不应该从insight课程中调用Parent。一个类的整个目的是提供封装。所以我要做的第一件事就是将insight移到Parent

要回答你的问题,更难以解决的方法是使用胖箭头表示法。胖箭头内部的作用是创建一个匿名函数来封装this

那就是说,最终的代码应该是这样的:

class Parent
  @style: (feature) =>
    if feature
      @insight()

  @insight: ->
    alert 'Sara is awesome'

class Child extends Parent
  @load: ->
    [42].forEach(@style)

Child.load()

希望有所帮助。

修改

基于OP评论:

class Parent
  style: (feature) =>
    if feature
      @insight()

class Child extends Parent
  load: ->
    [42].forEach(@style)

  insight: ->
    alert 'Sara is awesome'

(new Child()).load()