Стрелочная функция и this
Подскажите пожалуйста почему по разному работает данный код:
Функция конструктор function Rabbit(name) { this.name = name; this.func = () => { console.log(this.name)} } const rabbit = new Rabbit('Banny'); rabbit.func(); // Banny А в обычном объекте или функции: const rabbit = { name: 'Banny', func: () => { console.log(this.name)} } rabbit.func(); // undefined || window В стрелочных функциях, this привязан к окружению, в котором была создана функция. Все дело в ключевом слове new? |
Читайте, учите основы javascript
https://developer.mozilla.org/ru/doc...rrow_functions https://learn.javascript.ru/object-methods new тут роли не играет. Он создает объект, а не функцию. |
Babyslam, ты попутал синтаксис создания метода объекта...
const rabbit = { name: 'Banny', func() {alert(this.name)} } rabbit.func() И теперь все валишь на new... :nono: |
Цитата:
const rabbit = { name: 'Banny', func() {alert(this.name)} } rabbit.func() const rabbit = { name: 'Banny', func: function() {alert(this.name)} } rabbit.func() const rabbit = { name: 'Banny', func: () => {alert(this.name)} } rabbit.func() Это одни и те же свойства объекта. |
Babyslam, пробую твои варианты...
const rabbit0 = { name: 'Banny 0', func: () => {alert('0. ' + this.name)} } rabbit0.func() const rabbit1 = { name: 'Banny 1', func: function() {alert('1. ' + this.name)} } rabbit1.func() В нулевом нет данных по this.name... :no: |
Babyslam,
в первом варианте, через new, это примерно следующее function Rabbit(name) { // this = {}; this.name = name; this.func = () => { console.log(this.name)}; // return this; } Поэтому можно сказать что дело в наличии new перед функцией. |
Цитата:
Цитата:
|
Цитата:
Т.о. стрелочная возьмет this из "нормальной" функции, внутри которой она (стрелочная функция) находится. |
В первом случае, ты создал функцию конструктор и в этом случае, this - указывает на твой "локальный" объект, и дело тут не в new, уже в момент создания функции - конструктора, твой this указывает на неё же - на твою функцию конструктор, А во втором случае ты создал объект с ключом, у которого значение некая функция, которая обращается к глобальному объекту и ищет в нем свойство name ...
|
Часовой пояс GMT +3, время: 23:37. |