【问题标题】:Coffeescript incorrect scope of @ when passing method as callback将方法作为回调传递时,Coffeescript 的 @ 范围不正确
【发布时间】:2015-07-27 03:27:16
【问题描述】:

当我将带有粗箭头的匿名函数作为 socket.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 @

但是,如果我直接传入,现在作用域是socket的,就好像我用细箭头运行了之前的代码:

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 @

那么,有没有一种很好的干净的方法来获取对象范围,而不必通过胖匿名函数中继它们?第一种方法可行,但看起来有点笨拙,显然需要同步参数在所有方法中。提前致谢!

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:

    为什么不对属于类的函数使用粗箭头,从而将它们正确绑定到类的上下文(以及它的实例)——这更像是它的工作方式。

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

    另外,不要忘记在函数中添加空的返回值,它不打算返回一些东西。

    【讨论】:

    • 啊,类方法上的粗箭头实际上在内部使用了绑定。这听起来不错,应该很明显。谢谢! (ps,关于空返回,函数后面还有更多代码,我只是为了SO而将其剥离)
    • 另请参阅我关于 CoffeeScript 中的粗箭头以及为什么我避免使用细箭头的答案:stackoverflow.com/a/17431824/517371
    【解决方案2】:

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

    var bar = foo.create;
    bar();
    

    非常不同
    foo.create();
    

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

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

    不过,对 CoffeeScript 更了解的人可能会提供更好的东西。

    【讨论】:

    • 感谢您抽出宝贵时间回复。绑定确实有效。我也很好奇是否有咖啡解决方案,所以如果没有其他选择,我会接受你的回答!
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多