Coffeescript类和范围以及胖箭头和瘦箭头
在coffeescript类的粗箭头函数中,如何访问该类的作用域和函数 例如:Coffeescript类和范围以及胖箭头和瘦箭头,coffeescript,scope,arrow-functions,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=>
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”则是错误的,而如果我对each使用->则“this”的范围正确,但如何引用类函数栏
谢谢 这是因为在CoffeeScript中,
@
是此
的别名,即当您将.coffee编译为.js时,@
将替换为此
如果Example::bar
很难看,我认为没有“更漂亮”的解决方案
在调用之前,您可以存储对此的引用。每个:
class Example
foo: ->
self = @
$('.element').each ->
self.bar($(this)) # or self.bar($(@))
bar: (element) ->
element.hide()
虽然mak是对的,但他没有指出,在coffee脚本中,很少需要jQuery的每个方法,正如您所注意到的,这些方法会在未经您允许的情况下将您的执行上下文打在脸上
class Example
foo: ->
for element in $('.element')
@bar $(element)
bar: (element) ->
element.hide()
Coffee脚本的循环特性支持每个的概念,而不需要任何实际的自定义库代码。而且它们也不会生成新的范围或上下文,这意味着您不需要任何类型的胖箭头。检查不同的解决方案后。在这里,我看到了最完整的示例,并单击:
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))
我找到了一个临时解决方案:使用->然后使用Example::bar引用bar。它能用,但很难看。有谁有更好的解决方案吗?谢谢mak。回答得好。这表明我没有错过任何明显的东西,而且我喜欢self=@选项。我应该想到这一点。我还在习惯它,但我很喜欢它。另外,你觉得语法($'.foo')而不是$('.foo')怎么样?Topfunky试图推出第一款,但我还没有决定……好东西挤压!你完全正确。我已经把麦的答案留给了大家,但你的方式要整洁得多,而且还有很长的路要走。我在coffeescript中使用了一些旧js的转换,这就是我遇到这个问题的原因,但现在我知道的更多了。谢谢