Стрелочная функция и 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, время: 14:48. |