-При вызове функции `f` ее контекст (значение `this`) равняется `window`. Контекст самовызывающей функции также равняется `window`, поэтому значением `window.x` становится 3. Когда функцию вызывают с ключевым словом `new` - создается новый объект, который становится контекстом функции (конструктора), но самовызывающая функция этот контекст не получает, поэтому второй раз в консоль выводится 5. Дальше мы имеем дело с методом `m` объекта `obj`. Контекстом метода является объект, котрому данный метод принадлежит. Значением свойства `obj.x` является 4, что и выводится в консоль. Однако, если вызвать тот же метод с помощью `new`, то для `m` будет создан новый контекст, в этом новом контексте `x` будет иметь значение `undefined`. Вызывая функцию `f` с помощью `call(f)`, мы определяем, что контекст данной функции равен самой функции, т.е. `this === f`. Функция - это специальный вид объекта, которому, как и любому другому объекту, можно добавлять свойства. `f.x` равняется 5, что и выводится в консоль. Наконец, мы вызываем метод `m` с помощью `call(f)`, т.е. `this === f`. После предыдущего вызова свойство `f.x` равняется 5, поэтому вместо `undefined` в консоль снова выводится 5.
0 commit comments