胖箭'这'范围

时间:2012-05-09 21:33:05

标签: coffeescript scope this arrow-functions

考虑这段代码

 _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)

有没有办法在不使用细箭头的情况下使用闭包手动保存此引用(这=)?

2 个答案:

答案 0 :(得分:3)

AFAIK没有办法做到这一点;我会因为几个原因警告它:

  • 易于理解:当您使用哈希火箭(=>)时,您有效地告诉读者您需要/想要保留当前值this;重新引入第二个this混淆。

  • 未来兼容性:根据我的理解,下一个ECMAScript规范是支持=>,因为它甚至不会引入新的this 。 (如果CoffeeScript直接采用新版本,我也不会感到惊讶 该特征登陆时的箭头语法

带有显式引用的细箭头最终可能会使事情变得更加清晰。

答案 1 :(得分:0)

你总是可以使用嵌入式javascript来破解它:

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