JavaScript

Возврат, Задержка, и потерянный This (подробности внутри)

Всем привет=)

Не могу понять, в строке 14 (**)
1) Почему без передачи в нее this стрелочная функция не как работать не хочет=) По сути, стрелочные функции, не хранят this, возможно я что-то напутал?
>> Стрелочные функции не хранят this
Этого бреда Вы тут начитались, на "Ответиках"?
Лучше MDN читайте, где четко сказано:
«... лексически привязаны к значению this (но не привязаны к собственному this, arguments, super, или new.target).»

Каждый тип выражений используется по ситуации: в одних случаях подходят функциальные, в других - стрелочные. Данный вопрос такой же странный, как и "почему оператор + не умножает операнды?". Пишете фигню, оно и работает как фигня... это ожидаемый и закономерный результат. Не лучше ли изначально писать правильный код, чтобы он работал правильно...
Жалгас Унербеков
Жалгас Унербеков
95 817
Лучший ответ
Ну вам просто надо для себя понять что такое this это переведя на русский сленг программистов песочница надеюсь понятно что такое пасочница? объект на который this
обычно вне всяких функций и событий (this==window)//true
У вас же Function.prototype.defer=function(ms){console.log(console.log(this==window))}
console.log.defer();//fales
console.log.defer.apply(this,[]);//true
то есть this соответствует прототипной функции а не глобальной песочницы Что делает apply
передаёт ссылку на другую песочницу и список переменных Вот собственно и всё а из стрелочной функции обращения к this как не было так и нет поменялся лишь глобальный обект



Стасян Мойсеенко Спасибо! Вроде понял, без его передачи ничего в итоге не работает ((
Распечатал this)))) Что -то в этой песочнице можно себе шею сломать)))))
Стасян Мойсеенко ну вот, спалил свой браузер и страну)))
Не понял, какая проблема с this. В функции "f" this не используется. Мне кажется, функцию defer можно написать двумя осмысленными способами (они будут по разному работать с this).
В данном случае работающий тест такой:

let f = function() { console.log(this.a + this.b) };
let d = { a: 8, b: 3 };
d.fun = f.defer(3000);
d.fun();

Но такой вариант не работает:
d.fun = f;
d.fun.defer(3000)();
Саша Степанов
Саша Степанов
58 065
Алексей Севковский Да код конечно не для слабонервных чесание левой рукой правого ухп просунув её между ног ;)
Код придуман чтоб явно кого то запутать ;)

Не совсем понятно, что вы подразумеваете под "передачей this". Если вы имеете в виду, что нельзя обойтись без f=this, то это потому что this в 14-ой строке ссылается на контекст функции, объявленной в 12-ой (а не нужную нам), а та в свою очередь вызывается в контексте Window, а не f

Если вы имеете в виду использование this в вашем примере в 14-ой строке, то оно там нужно, чтобы указать в каком контексте вызвать функцию f.

На первой картинке код заработает без f=this. На второй без this в 14-ой строке.
Стасян Мойсеенко Спасибо! Чего то мой Node ругается когда к this.apply или call добавляю на прямую))