在传递回调方法时@的作用域不正确



当我传递一个带有粗箭头的匿名函数作为套接字时。. io回调,然后调用同一对象中的另一个方法(如下所示),@的作用域是正确的:

module.exports = class InviteCreateSocket extends AbstractSocket
  register: () ->
    @socket.on 'invite:create', (data, callback) => @create data, callback
  create: (data = {}, callback = @_noop) ->
    # This returns an instantiated InviteCreateSocket. Bonzer!
    console.log @
然而,如果我直接传递它,作用域现在是套接字的,就像我用细箭头运行前面的代码一样:
module.exports = class InviteCreateSocket extends AbstractSocket
  register: () ->
    @socket.on 'invite:create', @create
  create: (data = {}, callback = @_noop) ->
    # This returns the socket. Not bonzer. Not bonzer at all.
    console.log @

那么,是否有一种很好的干净的方式来获得对象作用域,而不必通过一个臃肿的匿名函数来传递它们?第一个方法工作,但似乎有点笨拙,显然需要同步所有方法中的参数。提前感谢!

为什么不为属于类的函数使用胖箭头,从而将它们正确地绑定到类(及其实例)的上下文中呢?

module.exports = class InviteCreateSocket extends AbstractSocket
  register: () =>
    @socket.on 'invite:create', @create
    return
  create: (data = {}, callback = @_noop) =>
    console.log @
    return

另外,不要忘记在函数中添加不打算返回的空返回值

不是Coffeescript专家,但我猜不是。这是因为Coffeescript被编译成JavaScript,而JavaScript等效对你不利。问题是:你不能有一个方法的引用,因为要成为一个方法,它必须在接收者上被调用。

var bar = foo.create;
bar();

非常不同
foo.create();

,因为前者不将this设置为foo。因此,当您只是传递@create时,它将您的方法与您的对象分离,并且@在您的方法中不再是正确的-现在只是一个函数。

现在,回到CoffeeScript:解决参数困境的更难看的方法是=> @create(arguments...)。这应该将所有参数传递给@create,无论它们是什么。但是,更好的方法是使用纯JS技术模拟胖箭头的作用:@create.bind(@) .

如果有更了解CoffeeScript的人,可能会有更好的东西。

最新更新