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) { ... }
}