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

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

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

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

1. При объявлении метода

Когда компилятор Coffeescript описывает следующий синтаксический шаблон в объявлении classа

class A somemethod: (paramlist) => 

Это даст следующий код внутри конструктора classа 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. При объявлении функции в глобальном контексте

Если вы определяете функцию свободного плавания (что означает как метод в classе, а не внутри другой функции / метода), как это

 foo = => @bar 

Тогда соответствующий Javascript будет выглядеть следующим образом:

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

Интересная вещь здесь снова заключается в том, что это присваивается _, что позволяет определить определение foo над этим .

Однако важная часть состоит в том, что это всегда глобальный контекст среды исполнения. Если вы находитесь в браузере, это будет объект windows. Если вы используете node.js, это будет тот модуль, который вы только что запустили.

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

  • В чем разница между «$ (this)» и «this»?
  • jQuery: исключить $ (this) из селектора
  • Давайте будем гением компьютера.