Coffeescript 如何从闭包内部调用实例方法?

Coffeescript 如何从闭包内部调用实例方法?,coffeescript,Coffeescript,我试图访问map调用中的实例方法,不幸的是,我对实例对象的引用被重新定义为Window。我不确定如何获得我的实例方法: class Test constructor: (@an_array) -> f: () -> @an_array.map (value) -> @a(value) a: (value) -> alert value t = new Test [1, 2, 3] t.f() // TypeError: Obj

我试图访问
map
调用中的实例方法,不幸的是,我对实例对象的引用被重新定义为Window。我不确定如何获得我的实例方法:

class Test
  constructor: (@an_array) ->

  f: () ->
    @an_array.map (value) ->
      @a(value)

  a: (value) ->
    alert value

t = new Test [1, 2, 3]
t.f() // TypeError: Object [object Window] has no method 'a'

通过定义一个变量来保存对该
的引用,我发现我可以做到这一点:

class Test
  constructor: (@an_array) ->

  f: () ->
    self = @
    @an_array.map (value) ->
      self.a(value)

  a: (value) ->
    alert value

t = new Test [1, 2, 3]
t.f()  // raises 3 alerts: 1, 2, 3


这感觉有点像黑客,所以我将把问答留给别人,让他们教我该如何做有多种方法可以解决这个问题

CoffeeScript中最常见的是使用生成绑定函数:

@an_array.map (value) => @a(value)
_this = @
@an_array.map (value) -> _this.a(value)
演示:

标准JavaScript方法也会起作用(有时是必要的或更合适的):

  • 保存对
    @
    的引用,这样您就不必关心回调函数中的
    内容:

    @an_array.map (value) => @a(value)
    
    _this = @
    @an_array.map (value) -> _this.a(value)
    
    演示:

    我倾向于使用
    \u this
    而不是
    self
    作为这个东西的名称,因为如果忘记JavaScript中的
    var
    ,就会出现一些有趣的bug

  • 使用手动创建绑定函数,但这并不是普遍支持的:

    @an_array.map ((value) -> @a(value)).bind(@)
    
    演示:

  • 使用jQuery、下划线或其他非本机绑定函数实现:

    @an_array.map _((value) -> @a(value)).bind(@)
    
    演示:

  • 您选择哪一个取决于您的环境和具体需求:

  • 如果您试图绑定一个来自其他地方的函数,那么您不能使用
    =>
    ,因此您需要使用上面的(2)(3)(或可能或)的一些变体
  • 如果您同时需要内部和外部
    ,那么您可以选择(1)
  • 如果您需要手动绑定一个函数,但不确定是否存在本机的
    bind
    ,那么您可能会得到(3),而(3)的哪个分支可能取决于您已经拥有的库
  • 利润

  • @你应该回答这个问题,我会把它标记为接受。这就是我要找的!或者我们可以把它作为副本,我想我已经回答了这个问题。如果你把问题解决了,我很高兴。@muistoshort我已经用了一段时间了,但我找不到答案。。。如果我们离开它,可能会帮助某人。我为后代添加了一个答案,这种东西很难搜索,你可能会注意到,我搜索的是我已经知道的答案,而不是一个问题:)