Жирная стрелка может использоваться в разных настройках, но она как-то не всегда привязывайтесь к экземпляру, который я хочу.
Когда "жирная стрелка" (=>) привязывается к экземпляру "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, это будет тот модуль, который вы только что запустили.
Предупреждение: В любом случае вы не должны определять какую-либо функцию, обращающуюся к вашему глобальному контексту. Это вызывает проблемы.