当我通过中间函数管道我的方法定义时,为什么胖箭头不会绑定到这个?

时间:2012-11-02 05:02:41

标签: coffeescript arrow-functions

我有以下代码声明了一个由中间人建议的方法 函数结果分配给原型槽之前的函数。

class A
    somemethod: advise => @dosomething()

为什么胖箭头在这种情况下不会绑定到实例?

1 个答案:

答案 0 :(得分:0)

简单回答

当中间件放在原型槽名称和功能之间时 定义你打破了CS发出的句法模式 绑定代码在构造函数

class A
    foo: (paramlist) =>
    bar: ()=>
    baz: =>

所有这些方法定义都在生成的Javascript构造函数

中发出此代码
function A() {
    this.foo = __bind(this.foo, this);
    this.bar = __bind(this.bar, this);
    this.baz = __bind(this.baz, this);
}

如果你在它们之间放置一些东西,你就会破坏那种语法模式 Coffeescript编译器可以识别该模式并生成必要的代码。

class A
    helpWhereIsMyMethod: processTheFollowing => @doSomething()

在这种情况下,不会生成构造函数中的绑定调用

更复杂的答案

定义原型槽(名称)并立即分配(匿名)函数时 你已经有效地创建了一个句柄,以便以后可以访问该功能 并“处理”或称之为(大多数情况)。

如果在绑定结果之前将函数传递给另一个函数(中介) 在原型槽中,您可以有效地创建一个以后无法访问的匿名函数。

因此Coffeescript编译器不知道如何在构造函数中发出绑定代码 因为在对象创建期间,不再提供对匿名函数的访问。

此外,中间函数可以生成自己的代码并发出这个新代码以绑定到原型槽。