Javascript Coffescript'@';在函数和类中也是如此

Javascript Coffescript'@';在函数和类中也是如此,javascript,coffeescript,Javascript,Coffeescript,在coffeescript中学习以下课程: class Canvas constructor: (finder) -> @canvas = $(finder) @mouse_down() mouse_down: -> @canvas.mousedown (e) -> mouse_x = e.pageX - @offsetLeft ### ... ### @redraw() redraw: ->

在coffeescript中学习以下课程:

class Canvas
  constructor: (finder) ->
    @canvas = $(finder)
    @mouse_down()
  mouse_down: ->
    @canvas.mousedown (e) ->
      mouse_x = e.pageX - @offsetLeft
      ### ... ###
      @redraw()
  redraw: ->
    ### ... ###
问题是在
mousedown
函数中调用类对象
redraw
方法。最好的解决方案是什么?我只发现:

  mouse_down: ->
    @canvas.mousedown (e) =>
      mouse_x = e.pageX - @canvas[0].offsetLeft
      ### ... ###
      @redraw()

你找到了更好的解决办法。但如果你愿意,你可以这样写:

mouse_down: ->
    self = @ 
    @canvas.mousedown (e) ->
      mouse_x = e.pageX - self.canvas[0].offsetLeft
      ### ... ###
      self.redraw()
看看这个:

class Canvas
   constructor: (finder) ->
      @canvas = $(finder)
      @mouse_down()
   mouse_down: ->
      redrawCallback = @redraw
      @canvas.mousedown (e) ->
         mouse_x = e.pageX - @offsetLeft
         ### ... ###
         redrawCallback()
   redraw: ->
      ### ... ###
如果redraw以任何方式引用@(画布类),请这样做更好(无论如何,这样做更安全):


另外,虽然这是一个品味问题,但我相信驼峰大小写比下划线更适合方法名。

祝贺您——您找到了解决方案!
=>
将函数绑定到
@
(或
)。@LinusGThiel,这是唯一的解决方案吗?它看起来并不漂亮。总是有,但这正是
=>
的用例。你特别不喜欢它的什么?@LinusGThiel,@canvas[0]。offsetLeft而不是这个。offsetLeft。@tiktak好的,我理解你的意思。是的,在这里你可以使用
@offsetLeft
class Canvas
  constructor: (finder) ->
     @canvas = $(finder)
     @mouse_down()
  mouse_down: ->
     redrawCallback = => @redraw()
     @canvas.mousedown (e) ->
        mouse_x = e.pageX - @offsetLeft
        ### ... ###
        redrawCallback()
  redraw: ->
     ### ... ###