Можете ли вы связать функции стрелок?
Я экспериментировал с 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, и результат тот же.
Ответы
Ответ 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)});
Ответ 7
Я задал тот же вопрос пару дней назад.
Вы не можете привязать значение, так как this
уже привязан.
Привязка разных возможностей к ES6 = > оператор функции
Ответ 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();