Для того, чтобы переменная `result` была объявлена и возвращена внутри рекурсии, вы можете передавать и обновлять ее значение как аргумент функции `recur()`.
Вот как можно переделать ваш код:
```javascript
let users = {
user1: {
name: 'Mike',
},
user2: {
name: 'Tom',
user3: {
name: 'David',
},
},
}
function recur(obj, result = []) {
for (let key in obj) {
if (typeof obj[key] !== 'object') {
result.push(obj[key])
} else {
recur(obj[key], result)
}
}
return result
}
console.log(recur(users)) // Результирующий массив
```
В этом коде мы добавляем `result` в качестве дополнительного аргумента в функцию `recur()`, и передаем его при вызове рекурсивной функции `recur()` внутри блока `else`. Таким образом, каждая итерация рекурсии будет иметь доступ к актуальному значению переменной `result`. Начальное значение `result` задано по умолчанию в аргументе функции `recur()`. В конце, мы возвращаем актуальное значение `result` из функции `recur()`.
Теперь `result` объявлен и возвращен внутри рекурсии, а вывод второго `console.log(result)` больше не требуется, так как все результаты уже выведены вместе с первым `console.log(recur(users))`.