2012-05-09 42 views
3

考虑以下代码脂肪箭头“这个”范围

_bindEvents: -> 
    @input.bind 'keyup', => 
    @filter($(this).val()) 
    if $this .val() is '' 
     @clearBtn.hide() 
    else 
     @clearBtn.show() 

很清楚,我认为“@”代表“_this。”所以它引用了父范围,但是如果我需要'内心这个'。

喜欢这一行:

@filter($(this).val()) 

编译成这样:

_this.filter($(_this).val()); // $(_this) 

,我需要这样的:

_this.filter($(this).val()); // $(this) 

有没有办法做到这一点不使用细箭头并使用closue(that = this)手动保存该引用?

回答

3

AFAIK没有办法做到这一点;我会警惕它的一对夫妇的原因:

  • 的易于理解:当您使用哈希火箭(=>),你就相当于告诉你所需要的读/希望保留当前值为this;重新引入第二个this混淆了这一点。

  • 未来的兼容性:从我的理解,未来的ECMAScript规范是支持=>的方式,它甚至不引入新的this。 (而且我也不会感到惊讶,如果直接的CoffeeScript采用了新的 箭头时语法功能的土地)

细箭头W /明确的引用将可能使事情到底有多清晰。

+0

谢谢,这使得很多的感觉:) – escusado

0

你总是可以破解这种使用嵌入的JavaScript:

`var second_this = this;` 
@filter($(second_this).val())