this внутри
function зависит от контекста вызова этой
function.
Когда срабатывает
onAuthStateChanged - вызывается переданная ему функция-обработчик, которой устанавливается какой-то
this(или не устанавливается, и тогда он по умолчанию
window или, в строгом режиме,
undefined). И этот
this точно никак не связан с текущим
this Vue, потому что тот никаким образом не передан при вызове, и, соответственно
onAuthStateChanged о нём ничего не знает.
Используй:
a)
(async function(user) { ... }).bind(this) чтобы жёстко привязать эту функцию к
this.
b)
vm.g = 5;, т.к. таким образом конкретный
this сохранён в переменную и не меняется в зависимости от контекста вызова.
c) стрелочную функцию
async (user) => { ... }, её механика работы по сути осуществляет неявный
bind.
d) функцию обработчик в методах Vue: Vue автоматически делает
bind всех методов к this:
onAuthStateChanged(this.onAuthStateChanged)
methods: {
onAuthStateChanged: async function (user) { ... }
}