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