1

使用胖箭头(将函数绑定到 this 的当前值)和将 @ 的值放入变量有什么区别?

胖箭头

Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  $('.shopping_cart').bind 'click', (event) =>
    @customer.purchase @cart

Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  self = @
  $('.shopping_cart').bind 'click', (event) ->
    self.customer.purchase self.cart

@建议使用粗箭头避免弄乱周围的范围。如何?

4

1 回答 1

2

我对您的两个片段以及其他两个粗箭头解决方案进行了基准测试,我觉得它们使用 CoffeeScript 的类语法更惯用:

class AccountWithFatCallback
  constructor: (@customer, @cart) ->
    $('.shopping_cart').bind 'click', (event) =>
      @customer.purchase @cart

class AccountWithFatProtoMethod
  constructor: (@customer, @cart) ->
    $('.shopping_cart').bind 'click', @onClickCart
  onClickCart: => 
    @customer.purchase @cart

所有这些都是使用最新的 CoffeeScript 编译器 v1.8.0 编译的,您可以在jsPerf上查看基准。四种实现之间的性能差异很小(约 5% 左右),所以我建议使用什么的决定因素应该是代码库的可读性和一致性,但我强烈建议你尝试使用 CoffeeScript 类因为他们为此提供了很多东西。

我要提出的唯一性能警告是避免多次创建胖箭头匿名函数,如果您可以选择创建一次并重新使用相同的绑定函数。使用胖箭头原型方法通过在构造函数中隐式绑定方法一次来实现这一点。

于 2014-11-21T13:19:26.517 回答