let / const declarations do hoist, but they throw errors when accessed before being initialized (instead of returning undefined as var would)
let x = 'outer scope';
console.log(x); // => outer scope
(function() {
console.log(x); // => ReferenceError (let is hoisted, but doesn't allow accessing)
console.log(y); // => undefined (var is hoisted and allows accessing)