O que causa os diferentes comportamentos entre “var” e “let” ao atribuir a eles um valor retornado de uma função que gera um erro

Encontre o código na imagem abaixo. 1. Atribua o valor retornado de uma função, que gera um erro, na variável 'withLet' declarada usando a palavra-chave 'let'. 2. chame 'withLet', ocorreu um erro: 'withLet não está definido'. 3. tente afirmar 'withLet' usando 'let', um erro mostra que 'withLet' já foi declarado.

Mas o paradoxo não existe para 'var' (encontre na imagem a seguir

Estou curioso sobre o que causou os diferentes comportamentos entre essas duas situações. É bastante claro que 'não definido' e 'já foi declarado' descrevem a mesma variável.

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"

Screenshot:

questionAnswers(1)

yourAnswerToTheQuestion