settimeout是一个消息队列的操作,它会 在js主进程结束并且指定时间之后调用,这个时候for循环已经执行完毕,共有10个settimeout回调函数需要执行,每个回调函数访问的都是真实的变量i,因此第一个循环输出10个10。第二个循环正如楼上回答说的,每个函数访问最近函数作用域的变量,并且匿名函数是立即执行的,因此输出1到10。