Qué causa los diferentes comportamientos entre "var" y "let" cuando les asigna un valor devuelto de una función que arroja un error

Por favor encuentre el código en la imagen de abajo. 1. Asigne el valor devuelto de una función, que arroja un error en realidad, a la variable 'withLet' que declaró mediante el uso de la palabra clave 'let'. 2. llame a 'withLet', se produjo un error: 'withLet no está definido'. 3. intente afirmar 'withLet' usando 'let', un error muestra que 'withLet' ya se ha declarado.

Pero la paradoja no existe para 'var' (Por favor, busque en la siguiente imagen).

Tengo curiosidad por saber qué causó los diferentes comportamientos entre estas dos situaciones. Está bastante conectado que 'no definido' y 'ya declarado' describen una misma variable.

let withLet = (function() {throw 'error!'})()
var withVar = (function() {throw 'error!'})()
//VM2470:1 Uncaught error!
//(anonymous) @ VM2470:1
//(anonymous) @ VM2470:1
withLet
//VM2484:1 Uncaught ReferenceError: withLet is not defined at 
//<anonymous>:1:1
//(anonymous) @ VM2484:1
withVar
//undefined
let withLet = 'sth'
//VM2520:1 Uncaught SyntaxError: Identifier 'withLet' has already been 
//declared
//at <anonymous>:1:1
//(anonymous) @ VM2520:1
withVar = 'sth'
//"sth"

Captura de pantalla