Даже если сделаешь так, как предложил предыдущий отвечающий, проблему это не решит. Да, переменная будет видна, но значения у currency в момент срабатывания alert не будет.
Твой alert сработает сразу после выполнения fetch - НЕ дожидаясь ответа сервера. А код, который присваивает значение currency, выполнится намного позже - ПОСЛЕ того, как ответ от сервера будет получен. Промисы нужны именно для того, чтобы разместить в них ВЕСЬ код, который должен быть выполнен после получения ответа сервера. И если хочешь сделать alert - помести его в промис:
let currency;
fetch('https://www.floatrates.com/daily/usd.json')
.then(response => response.json())
.then(response => {
currency = JSON.stringify(response.usd.currency);
alert(currency);
});
Если хочешь, чтобы твой асинхронный код был похож на синхронный, используй не промисы, а async / await. Да, внутри них тоже промисы, но они замаскированы и внешне код выглядит как линейный.
Вы прям потратили время , скопировали мой код , протестировали , улучшили и показали 2 рабочих / готовых примера.
Спасибо.