我是CoffeScript的新手,我想知道是否有一种方法可以在不引用全局变量应用程序的情况下编写以下代码:
class App
constructor: ->
@ui = ui.init()
$('#content-holder a[rel!=dialog]').live 'click', ->
link = $(@).attr 'href'
app.loadUrl link
return false
loadUrl: (href) ->
# ...
app = new App()
使用胖箭头不起作用,因为我失去了对jQuery对象的引用,即
class App
constructor: ->
@ui = ui.init()
$('#content-holder a[rel!=dialog]').live 'click', =>
# @ now references App
link = $(@).attr 'href'
this.loadUrl link
return false
loadUrl: (href) ->
# ...
第一段代码可以工作,但是如果可能的话我想摆脱全局变量: - )
干杯, 暖气。
答案 0 :(得分:11)
您的点击处理程序会传入一个事件...因此您可以使用“胖箭头”充分利用这两个世界,而无需同时引用self
:
constructor: ->
@ui = ui.init()
$('#content-holder a[rel!=dialog]').live 'click', (e) =>
link = $(e.target).attr 'href'
@loadUrl link
return false
答案 1 :(得分:6)
嗯,CS只是JS的更高级语法。
在JS this
中只能引用一个对象。
胖箭头使用闭包使this
等于更高级别this
,仅此而已,这就是它在回调范围内覆盖this
的原因
相反,普通箭头只是function
别名,这就是this
在第一种情况下是DOM元素的原因。
最后,@something
被简单地翻译为this.something
,并且不做任何其他事情。
所以,我的意见 - 你最好的选择是在绑定之前做self = @
。