什么时候“胖箭头”(=>)绑定到“this”实例

时间:2012-11-01 19:33:27

标签: coffeescript this arrow-functions

胖箭头可以在不同的设置中使用,但它不知道 总是绑定到我想要的实例。

1 个答案:

答案 0 :(得分:14)

脂肪箭3次结合

  1. 声明方法时
  2. 在方法中声明函数时
  3. 在全局上下文中声明函数时
  4. 1。声明方法时

    当Coffeescript编译器鼓励使用以下语法模式时 在类声明中

    class A
        somemethod: (paramlist) =>
    

    这将在A类的构造函数中生成以下代码

    this.somemethod = __bind(this.somemethod, this);
    

    那个实例的定义是覆盖初始赋值 使用函数的绑定版本

    2。在方法

    中声明函数时

    在Coffeescript编译器的方法中定义带有胖箭头的函数时 自动创建一个闭包,并将外部方法的 阴影变为变量 的 _this 即可。内部函数中对 @ 的任何引用都将使用变量 _this 在生成的javascript代码中

    somemethod: ->
       => @someCall()
    

    这是相应的Javascript

    A.prototype.somemethod = function() {
        //_this references this
        var _this = this;
        return function() {
            //and _this is now used within the inner function
            return _this.someCall();
        };
    };
    

    没有胖箭头的函数定义不会为您创建闭包。

    3。在全局上下文中声明函数时

    如果您定义一个自由浮动函数(意思是类中的方法而不是另一个函数/方法中),就像这样

    foo = => @bar
    

    然后相应的Javascript将如下所示

    var foo,
      _this = this;
    
    foo = function() {
        return _this.bar;
    };
    

    有趣的是,被分配给_ this ,这使得 foo 的定义能够关闭_

    然而,重要的是始终是执行环境的全局上下文。如果您在浏览器中它将是窗口对象。如果您正在运行node.js,那么它将是您正在运行的模块。

    警告:您无论如何都不应定义访问全局上下文的任何函数。这需要麻烦。