7

在咖啡脚本类的胖箭头函数中,如何访问类的范围以及函数?

例子:

class Example
  foo: ->
    $('.element').each =>  # or ->
      @bar($(this))        # I want to access 'bar' as well as the jquery element
  bar: (element) ->
    element.hide()

所以在这个例子中,如果我使用a =>,那么@ 指的是类的this,但是'this' 是错误的,而如果我对每个使用a ->,那么'this' 的范围是正确的,但是但是那我如何引用类函数栏呢?

谢谢!

4

3 回答 3

16

虽然 mak 是对的,但他没有指出在咖啡脚本中您很少需要 jQuery 的each方法,正如您所注意到的,它会在未经您许可的情况下猛烈抨击您的执行上下文。

class Example
  foo: ->
    for element in $('.element')
      @bar $(element)

  bar: (element) ->
    element.hide()

Coffee 脚本的循环功能支持each完全没有任何实际自定义库代码的概念。而且它们也不会生成新的范围或上下文,这意味着您不需要任何类型的粗箭头。

于 2011-08-04T20:39:29.603 回答
10

这是因为在 CoffeeScript@中是thisie 的别名,当您将 .coffee 编译为 .js时,@将替换为this.

如果Example::bar丑陋,我认为没有“更漂亮”的解决方案。

您可以this在调用之前存储对的引用.each

class Example
  foo: ->
    self = @
    $('.element').each ->
      self.bar($(this)) # or self.bar($(@))
  bar: (element) ->
    element.hide()
于 2011-08-04T13:34:32.860 回答
3

检查不同的解决方案后。这里出现了一些对我来说是最完整的示例,然后单击:

class MainApp
  self = []

  constructor: ->
    self = @

  toDoOnClick: (event) ->
    self.bar($(event.target)) #hide the clicked object

  bar: (element) ->
    element.hide()

  sampleMethod:->
    $(".myDiv").click (e) -> self.toDoOnClick(e)
    $('.element').each ->
      self.bar($(this))
于 2013-09-26T13:44:52.357 回答