#javascript
This question already has answers here: Потеря контекста вызова (5 ответов) Не могу понять роль нуля в данном контексте. JS (1 ответ) Закрыт 1 год назад. function foo() { return this; } let bar = { foo }; console.log( foo(), bar.foo(), (bar.foo)(), (bar.foo = bar.foo)(), // здесь ); Собственно, понятно, почему bar.foo() вернет bar. Почему (bar.foo)() вернет bar - тоже. А вот почему теряется контекст в последнем выражении - вообще непонятно. Непонятно также, что делает такая конструкция. Что она в конечном итоге вызывает? Левый операнд или правый? (Понятно, что в данном конкретном случае разницы нет, но я говорю про общий случай).
Ответы
Ответ 1
foo() - вызов функции в глобальном контексте (тут все просто) bar.foo() - вызов метода объекта bar - JS создал для вас ключи у объекта (вообще так создавать объекты не есть хорошо, но JS решил что это должно выглядеть так {foo: foo, baz: baz}). См. короткая нотация (bar.foo)() - то же самое что и в прошлом случае (bar.foo = bar.foo)() - тут интереснее - мы вызываем не метод объекта, а глобальную функцию, которая является результатом выражения в скобках. То есть мы берем значение поля - которое является функцией и присваиваем другому полю (в данном случае они одинаковые), но результатом будет именно эта функция а не поле (поскольку последней операцией в скобках было присваивание, а не разыменование метода) Дополнение Если выполнить пример в строгом режиме - при потере контекста получим undefined. См this в контексте функции
Комментариев нет:
Отправить комментарий