Основное различие заключается в области видимости, которую они создают, и, как следствие, в том, как они влияют на значение переменной, захваченной замыканием.
Переменные, объявленные с помощью var, имеют функциональную или глобальную область видимости. В цикле, например, замыкание захватывает последнее значение переменной var из-за подъема (hoisting).
javascript
Переменные, объявленные с помощью let, имеют блочную область видимости. В цикле let создает новую переменную для каждой итерации, и замыкание захватывает значение переменной для конкретной итерации цикла.
javascript
В контексте замыкания это означает, что замыкание, захватившее переменную var, будет ссылаться на одно и то же место в памяти, которое содержит последнее значение переменной. Замыкание, захватившее переменную let, будет ссылаться на отдельное место в памяти для каждой итерации цикла.