你第二个问题也不是let块级作用域的问题,其实你这个let用法和var用法就没区别,你会发现你上面两个例子换成var都是一个鬼样子。 你这个思路完全错了,兄弟。 你要知道let有块级作用域,那你得知道他是为了解决var的什么问题。 var是函数作用域 。意味着的是什么 if (true) { var a = 1 } console.log(a) // 1,原因是var是函数作用域,所以在if这个块中定义的变量其实就相当于全局变量,等同于下面 var a if (true) { a = 1 } 这会导致的问题是让人摸不着发际线 所以有了let,解决的问题是解决块级作用域的问题,还是上面的问题 if (true) { let a = 1 } console.log(a) // a is not defined 这才是let解决的问题 你上面遇见的问题就是你连作用域都没分清楚,兄弟