请教,这种情况能访问到i是因为形成了闭包还是什么原因呢?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let arr = []
        for (let i = 0; i < 3; i++) {
            arr.push(function () {
                console.log(i);;
            })
        }
        let i = 10;
        arr[0](); //0
    </script>
</body>

</html>

 

let会形成块级作用域,循环3次,会产生3个块级作用域,每个作用域中的i是互不影响的。
arr在执行时会在函数作用域内寻找变量i,没有找到时会向上级作用域也就是for循环产生的块级作用域,所以输出0