Подтвердить что ты не робот

Можете ли вы связать функции стрелок?

Я экспериментировал с ES6 некоторое время, и у меня возникла небольшая проблема.

Мне действительно нравится использовать функции стрелок, и когда я могу, я использую их.

Однако может показаться, что вы не можете связать их!

Вот функция:

var f = () => console.log(this);

Вот объект, к которому я хочу привязать функцию:

var o = {'a': 42};

И вот как я бы связал f с o:

var fBound = f.bind(o);

И тогда я могу просто позвонить fBound:

fBound();

Который выведет это (объект o):

{'a': 42}

Здорово! Прекрасный! За исключением того, что это не работает. Вместо вывода объекта o он выводит объект window.

Итак, я хотел бы знать: вы можете связать функции стрелок? (А если так, то как?)


Я тестировал код выше в Google Chrome 48 и Firefox 43, и результат тот же.

4b9b3361

Ответ 1

Вы не можете "перепривязать" функцию стрелки. Он всегда будет вызываться с контекстом, в котором он был определен. Просто используйте нормальную функцию.

Из спецификации ECMAScript 2015:

Любая ссылка на аргументы, super, this или new.target в ArrowFunction должна преобразовываться в привязку в лексически закрытой среде. Обычно это будет функциональная среда непосредственно включающей функции.

Ответ 2

Чтобы завершить, вы можете повторно связать функции стрелок, вы просто не можете изменить значение this.

bind все еще имеет значение для аргументов функции:

((a, b, c) => {
  console.info(a, b, c) // 1, 2, 3
}).bind(undefined, 1, 2, 3)()

Попробуйте это здесь: http://jsbin.com/motihanopi/edit?js,console

Ответ 3

Из MDN:

Выражение функции со стрелкой имеет более короткий синтаксис по сравнению с выражениями функций и лексически связывает значение this (не привязывает свое собственное this, arguments, super или new.target). Функции стрелок всегда анонимны.

Это означает, что вы не можете привязать значение к нему так, как хотите.

Ответ 4

В течение многих лет разработчики js боролись с привязкой к контексту, спрашивали, почему this изменилось в javascript, так много путаницы на протяжении многих лет из-за связывания контекста и разницы между значением this в javascript и this в большинстве других языков ООП.

Все это заставляет меня спросить, почему, почему! почему бы вам не восстановить функцию стрелки! Те, которые созданы специально для решения всех этих проблем и недоразумений, и не должны использовать bind или call или каким-либо другим способом сохранить область действия функции.

TL; DR

Нет, вы не можете восстановить функции стрелок.

Ответ 5

Сделайте ES6 Arrow Функции действительно решить "это" в JavaScript

Выше ссылка объясняет, что стрелка функция this не меняется с bind, call, apply функции.

Это объясняется очень хорошим примером.

запустите это в node v4 чтобы увидеть "ожидаемое" поведение,

this.test = "attached to the module";
var foo = { test: "attached to an object" };
foo.method = function(name, cb){ 
    // bind the value of "this" on the method 
    // to try and force it to be what you want 
    this[name] = cb.bind(this); };
foo.method("bar", () => { console.log(this.test); });
foo.bar(); 

Ответ 6

var obj = {value: 10};
function arrowBind(context, fn) {
  let arrowFn;
  (function() {
    arrowFn = eval(fn.toString());
    arrowFn();
  }).call(context);
}
arrowBind(obj, () => {console.log(this)});

Ответ 8

Может быть, этот пример поможет вам:

let bob = {
   _name: "Bob",
   _friends: ["stackoverflow"],
   printFriends:(x)=> {
      x._friends.forEach((f)=> {
         console.log(x._name + " knows " + f);
      });
   }
}

bob.printFriends = (bob.printFriends).bind(null,bob);
bob.printFriends();