Coffeescript类和范围以及肥胖和细箭头

时间:2011-08-04 12:31:36

标签: coffeescript scope arrow-functions

在coffeescript类的胖箭头函数中,如何访问类的范围以及函数?

示例:

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'是正确的范围,但那么我如何引用类功能栏?

谢谢!

3 个答案:

答案 0 :(得分:16)

虽然mak是对的,但他没有指出在咖啡脚本中你很少需要jQuery的each方法,正如你所注意到的那样,在未经你许可的情况下将你的执行上下文打到了脸上。

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

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

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

答案 1 :(得分:10)

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

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

您可以在致电this之前存储对.each的引用:

class Example
  foo: ->
    self = @
    $('.element').each ->
      self.bar($(this)) # or self.bar($(@))
  bar: (element) ->
    element.hide()

答案 2 :(得分: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))