首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CoffeeScript,何时使用胖箭头(=>)而不是箭头(->),反之亦然

CoffeeScript,何时使用胖箭头(=>)而不是箭头(->),反之亦然
EN

Stack Overflow用户
提问于 2012-01-23 07:53:50
回答 3查看 31.9K关注 0票数 139

在CoffeeScript中构建类时,是否应该使用=> (“胖箭头”)运算符定义所有实例方法,并使用->运算符定义所有静态方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-23 08:18:17

不,这不是我会用的规则。

我在定义方法中找到的胖箭头的主要用例是,当你想使用一个方法作为回调,并且该方法引用实例字段时:

代码语言:javascript
复制
class A
  constructor: (@msg) ->
  thin: -> alert @msg
  fat:  => alert @msg

x = new A("yo")
x.thin() #alerts "yo"
x.fat()  #alerts "yo"

fn = (callback) -> callback()

fn(x.thin) #alerts "undefined"
fn(x.fat)  #alerts "yo"
fn(-> x.thin()) #alerts "yo"

正如您所看到的,如果您不使用胖箭头,那么在传递对实例方法的引用作为回调时可能会遇到问题。这是因为胖箭头将对象的实例绑定到this,而细箭头不绑定,因此上面称为回调的细箭头方法不能访问实例的字段,如@msg或调用其他实例方法。最后一行是针对使用了细箭头的情况的变通方法。

票数 161
EN

Stack Overflow用户

发布于 2012-01-23 08:19:17

通常,->是很好的。

代码语言:javascript
复制
class Foo
  @static:  -> this
  instance: -> this

alert Foo.static() == Foo # true

obj = new Foo()
alert obj.instance() == obj # true

请注意,静态方法如何返回this的类对象,实例如何返回this的实例对象。

实际情况是,调用语法提供了this的值。在此代码中:

代码语言:javascript
复制
foo.bar()

默认情况下,foo将是bar()函数的上下文。所以它只是按照你想要的方式工作。只有当您以其他方式调用这些函数时才需要胖箭头,这些方法不使用点语法进行调用。

代码语言:javascript
复制
# Pass in a function reference to be called later
# Then later, its called without the dot syntax, causing `this` to be lost
setTimeout foo.bar, 1000

# Breaking off a function reference will lose it's `this` too.
fn = foo.bar
fn()

在这两种情况下,使用胖箭头声明该函数将允许它们工作。但是,除非你正在做一些奇怪的事情,否则你通常不需要这样做。

因此,在真正需要=>之前,请一直使用->,并且在默认情况下永远不要使用=>

票数 9
EN

Stack Overflow用户

发布于 2015-07-19 04:37:07

这只是一个不理解这个大箭头的例子

不工作:(@canvas未定义)

代码语言:javascript
复制
class Test
  constructor: ->
    @canvas = document.createElement 'canvas'
    window.addEventListener 'resize', ->
      @canvas.width = window.innerWidth
      @canvas.height = window.innerHeight

作品:(@canvas已定义)

代码语言:javascript
复制
class Test
  constructor: ->
    @canvas = document.createElement 'canvas'
    window.addEventListener 'resize', =>
      @canvas.width = window.innerWidth
      @canvas.height = window.innerHeight
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8965855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档