Стрелочные функции привязываются к текущему контексту.
Что это значит?
Это значит, что внутри функции будет значение this будет таким же, как и в момент создания.
Рассмотрим примеры из вопроса:
(function(){
const requestBtn = d.getElementById('reqestInfo');
requestBtn.addEventListener('click', ()=>{ console.log(this) }, false)
})()
Данный код выполняется внутри самовызывающейся функции. Внутри такой функции this -> глобальный объект, в данном случае window. Следовательно внутри обработчика, этот this сохранится.
Второй пример:
(function(){
const requestBtn = d.getElementById('reqestInfo');
requestBtn.addEventListener('click', ()=>{ console.log(this) }.bind(requestBtn), false)
})()
Здесь действительно синтаксическая ошибка, чтобы ее исправить нужно обернуть стрелочную функцию в круглые скобки
(()=>{ console.log(this) }).bind(requestBtn)
Но и это не поможет, так как у стрелочных функций нельзя сменить контекст, полученный при создании.
Теперь, почему работает последний пример:
(function(){
const requestBtn = d.getElementById('reqestInfo');
requestBtn.addEventListener('click', function(){ console.log(this) }, false)
})()
Потому что, при добавлении обработчика через функцию addEventListener, обработчик вызывается в контексте добавленного элемента. То есть, это по сути нормальное поведение, когда this внутри обработчика ссылается на элемент, и все пляски со сменой контекста обычно обусловлены тем, что в обработчике в качестве this хотелось видеть, не элемент, а какой-нибудь сторонний объект.