coffeescript - "fat arrow"(=>) 何时绑定(bind)到 "this"实例

标签 coffeescript this arrow-functions

胖箭头可以在不同的设置中使用,但不知何故不能
总是绑定(bind)到我想要的实例。

最佳答案

胖箭绑定(bind)了3次

  • 声明方法时
  • 在方法中声明函数时
  • 在全局上下文中声明函数时

  • 1.声明方法时

    当 Coffeescript 编译器遇到以下语法模式时
    在类声明中
    class A
        somemethod: (paramlist) =>
    

    这将在类 A 的构造函数中产生以下代码
    this.somemethod = __bind(this.somemethod, this);
    

    那就是该实例的定义是覆盖初始分配
    带有函数的绑定(bind)版本

    2.在方法中声明函数时

    当您在方法中定义带有粗箭头的函数时,Coffeescript 编译器
    自动创建闭包和阴影这个将外部方法放入变量中
    _这个 .对 的任何引用@ 在内部函数中将使用变量 _这个
    在生成的 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. 在全局上下文中声明函数时

    如果您像这样定义一个自由 float 函数(意思是类中的方法而不是另一个函数/方法中的方法)
    foo = => @bar
    

    那么对应的Javascript会是这个样子
    var foo,
      _this = this;
    
    foo = function() {
        return _this.bar;
    };
    

    这里再次有趣的是 this 被分配给 _this,这使得 foo 的定义能够关闭 _this。

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

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

    关于coffeescript - "fat arrow"(=>) 何时绑定(bind)到 "this"实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13184209/

    相关文章:

    javascript - coffeescript 排序不正确

    javascript - 将 `this` 的继承扩展到 `object` 的方法/属性

    angularjs - typescript :数据未分配给类变量

    javascript - ReactJS 问题 : () => vs function ()

    django - 如何在 Django 项目中使用 CoffeeScript ?

    javascript - CoffeeScript + KnockoutJS 函数绑定(bind)

    javascript - 如何在箭头函数中使用 'this' 来引用被单击的元素

    javascript - 带 React Native 导航的可触摸 onPress 不起作用

    ruby-on-rails - 在 slim 模板中渲染部分咖啡

    javascript - Angular Directive(指令) Controller "this"返回未定义