这两个函数为什么运行结果差异解释

首先他么的数组中放的都是没有执行的函数体,在下面执行的时候调用i这个变量,我可以理解第二个的输出,但是第一个的返回值i为什么可以固定i循环时的值,他本身有没有执行

这段代码
 var list = []
        var str = ''
        for (var i = 0; i < 10; i++) {
            (function (i) {
                console.log(i)
                list.push(function () {
                    return i
                })
            })(i)
        }
        console.log(list)
        for (var j = 0; j < 10; j++) {
            console.log(list[j]())
            str += list[j]()
        }
        console.log(str)//输出0123456789
和这段代码
var list = []
        var str = ''
        for (var i = 0; i < 10; i++) {

            list.push(function () {
                console.log(i)
                return i
            })
            console.log(list[i])
        }
        console.log(i)
        console.log(list)
        for (var j = 0; j < 10; j++) {
            // console.log(list[j])
            str += list[j]()
        }
        console.log(str)//输出10101010101010101010
 </script>