Coffeescript 什么时候;“胖箭”;(=>;)绑定到";这";实例

Coffeescript 什么时候;“胖箭”;(=>;)绑定到";这";实例,coffeescript,this,arrow-functions,Coffeescript,This,Arrow Functions,胖箭头可以在不同的设置中使用,但不知何故它不能 始终绑定到我想要的实例。胖箭头在3种情况下绑定 在声明方法时 在方法中声明函数时 在全局上下文中声明函数时 1.在声明方法时 当Coffeescript编译器遇到以下语法模式时 在类声明中 class A somemethod: (paramlist) => 这将在类A的构造函数中生成以下代码 this.somemethod = __bind(this.somemethod, this); 即该实例的定义正在覆盖初始分配 使用函数

胖箭头可以在不同的设置中使用,但不知何故它不能
始终绑定到我想要的实例。

胖箭头在3种情况下绑定

  • 在声明方法时
  • 在方法中声明函数时
  • 在全局上下文中声明函数时
  • 1.在声明方法时 当Coffeescript编译器遇到以下语法模式时 在类声明中

    class A
        somemethod: (paramlist) =>
    
    这将在类A的构造函数中生成以下代码

    this.somemethod = __bind(this.somemethod, this);
    
    即该实例的定义正在覆盖初始分配 使用函数的绑定版本

    2.在方法中声明函数时 当您在方法中定义带有胖箭头的函数时,Coffeescript编译器 自动创建一个闭包,并将外部方法的此投影到变量中 \u这是。内部函数中对@的任何引用都将使用变量\u 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
    
    var foo,
      _this = this;
    
    foo = function() {
        return _this.bar;
    };
    
    然后相应的Javascript将如下所示

    foo = => @bar
    
    var foo,
      _this = this;
    
    foo = function() {
        return _this.bar;
    };
    
    这里有趣的是,这被分配给了,这使得foo的定义能够结束

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


    警告:无论如何,您不应该定义任何访问全局上下文的函数。这会带来麻烦。

    另请参阅此讨论和我的答案: