Когда "жирная стрелка" (=>) привязывается к экземпляру "this"

Жирная стрелка может использоваться в разных настройках, но она как-то не всегда привязывайтесь к экземпляру, который я хочу.

Ответ 1

Жирная стрелка связывается в 3 раза

  • при объявлении метода
  • при объявлении функции внутри метода
  • при объявлении функции в глобальном контексте

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, это будет тот модуль, который вы только что запустили.

Предупреждение: В любом случае вы не должны определять какую-либо функцию, обращающуюся к вашему глобальному контексту. Это вызывает проблемы.