Lexx, давайте разберём. Просто опишите свою логику,
почему оно должно работать.
Что, по вашему мнению, должна делать вот эта строчка?:
span = document.createElement('span').innerHTML = `<span>${getFullName()}</span>`
В реальности тут создаётся глобальная
переменная span в которую кладётся строка
`<span>${getFullName()}</span>`, также создаётся
элемент span, внутрь которого кладётся другой
span, внутрь которого кладётся возврат
getFullName(). После чего это нигде и никак не используются, созданный элемент удаляется сборщиком мусора, а глобальная переменная со строкой остаётся бесполезно висеть.
Что, по вашему мнению, должна делать вот эта строчка?:
return toString();
В реальности тут вызывается toString() глобального объекта(window) без контекста(в контексте undefined). Никакого отношения к твоему объекту этот вызов не имеет.