Если вы хотите знать, почему это происходит, ответ прост, подъем поднимает все объявления в верхнюю часть его области видимости, поэтому:
console.log(this.abc); //undefined
console.log(abc in this); //true
console.log(abc); //undefined
function abc() {
console.log("hello");
}
console.log(abc); //ƒ abc(){console.log("hello");
поэтому во внутренней функции функция abc () объявляется в верхней части текущей области видимости, оставаясь почти на той же позиции, но только на объявлении, поэтому var abc объявляется и назначается, когда вы пытаетесь получить доступ к Внизу он уже знает эту функцию, в первом файле console.log, где вы получите undefined
console.log (abc) функция _abc еще не объявлена, но во втором примере у вас есть к ней доступ, потому что она обращается к объекту windows и получает abc.
Итак, вкратце, javascript сначала инициализирует переменные, поскольку во втором console.log все переменные уже объявлены, и они объявлены в объекте окна, при этом доступ к abc в этом случае работает нормально.