1. f(); // 3
2. new f(); // 5
3. obj.method(); // 3
4.
obj.method.call(f); // 3
1. Сначала f меняет window.x, потом IIFE меняет window.x на 3
2. new f() настраивает this внутри f на новый объект, у него x станет 5, и в консоль выведет функция f значение х у нового объекта
3. obj.method() вызовет стрелочную функцию, которая не будет работать с obj, а возьмет window.x, а там 3 после вызова функции f() во второй раз, там же еще IIFE внутри отработала, которая this видела как window, потому у window.x - 3
4. Все тоже самое, что в п.3, потому что контекст у лямбды не меняется