关于new promise的执行顺序问题

我的理解是首先声明a,然后打印,然后把promise对象赋值给a,打印a应该是promie但是打印undefined,最后才赋值给a然后打印promise
也就是说它执行new Promise的时候跳过了赋值操作,先去打印了a,但是这是为什么呢?第二种写法也会把a打印出来啊

<script>
        let a
        console.log(a)//undefined

        a = new Promise((resolve, reject) => {
            console.log(a)//undefined
        })
        console.log(a)//promise
//但是我这样写就会把函数打印出来
 let a
        console.log(a)
        a = function () {
            console.log(a)
        }
        a()
        console.log(a)
</script>