Я уже некоторое время экспериментирую с 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, и результат тот же.
this
объект своей родительской области.Ответы:
Вы не можете повторно привязать
this
стрелочную функцию. Он всегда будет определяться как контекст, в котором он был определен. Если вам нужноthis
быть осмысленным, вы должны использовать обычную функцию.Из спецификации ECMAScript 2015 :
источник
this
. Эти два понятия связаны, но не одно и то же.this
внутри стрелочной функции всегда «наследует»this
из окружающей области видимости. Это особенность стрелочных функций. Но вы все равно можете использоватьbind
все остальные параметры стрелочной функции. Просто нетthis
.Для полноты, вы можете повторно связать стрелочные функции, вы просто не можете изменить значение
this
.bind
все еще имеет значение для аргументов функции:Попробуйте здесь: http://jsbin.com/motihanopi/edit?js,console
источник
this
которому привязана функция (стрелка), без ссылки (что, конечно, определяется лексически)?Из MDN :
Это означает, что вы не можете привязать значение так,
this
как хотите.источник
В течение многих лет разработчики js боролись с привязкой контекста, спрашивали, почему
this
изменилось в javascript, так много путаницы за эти годы из-за привязки контекста и разницы между значениемthis
в javascript иthis
в большинстве других языков ООП.Все это заставляет меня спрашивать, почему, почему! почему бы вам не перепривязать стрелочную функцию! Те, которые созданы специально, чтобы решить все эти проблемы и недоразумения и избежать необходимости использовать
bind
илиcall
или любой другой способ сохранить объем функции.TL; DR
Нет, вы не можете повторно привязать стрелочные функции.
источник
this
не работает. лямбды должны бытьarguments => output
. Если вам нужен какой-то внешний контекст, передайте его. Само существованиеthis
- это то, что облегчило все внедрение объектно-ориентированных шаблонов в язык. Без него вы бы никогда не услышали термин «класс javascript».this
.Вы не можете использовать
bind
для изменения значенияthis
внутри стрелочной функции. Однако вы можете создать новую обычную функцию, которая делает то же самое, что и старая стрелочная функция, а затем использоватьcall
илиbind
для повторного связыванияthis
как обычно.Здесь мы используем
eval
вызов, чтобы воссоздать функцию стрелки, которую вы передали как обычную функцию, а затем использоватьcall
для ее вызова с другимthis
:источник
Действительно ли стрелочные функции ES6 решают «это» в JavaScript
Приведенная выше ссылка объясняет, что функции стрелок
this
не меняются вместе сbind, call, apply
функциями.Это объясняется на очень хорошем примере.
запустите это,
node v4
чтобы увидеть "ожидаемое" поведение,источник
Я задал тот же вопрос пару дней назад.
Вы не можете привязать значение, так как
this
оно уже привязано.Связывание другой этой области с ES6 => оператор функции
источник
this
тоже привязан. Дело в том, что в стрелочных функциях он не имеет локальной привязки.Короче говоря, вы НЕ МОЖЕТЕ привязать стрелочные функции, но читайте дальше:
Представьте, что у вас есть эта стрелочная функция, под которой печатается
this
на консоли:Таким образом, для быстрого решения этой проблемы будет использоваться обычная функция, поэтому просто измените ее на:
Затем вы можете привязать его к любой лексической среде, используя
bind
илиcall
илиapply
:и назовите его в случае
bind
.Существуют также способы использования
eval()
, которые настоятельно не рекомендуются .источник
function myFunc
отличается в поведении не только в том, что его можно связывать; был бы более близкий матчconst myFunc = function() {...}
. Мне также любопытно, что вы имеете в виду, говоря об использовании eval, поскольку я не думаю, что это подход, в котором раньше делились какие-либо ответы - было бы интересно посмотреть, как это делается, а затем прочитать, почему это так сильно не рекомендуется.Может быть, вам поможет этот пример:
источник