// 异步引起的for循环问题 1
// 异步引起的for循环问题 2
这两段代码中结果最终只输出5真的和闭包没有一点关系。真正的原因是当给元素绑定事件或者设置定时器函数时就会形成异步;又因为js是单线程语言(一次只执行一件事情在当前事件尚未执行完之前,即使异步函数调用事件到了也要先把当前的事情执行完);这两段代码开始执行后首先读取到for循环(声明并初始化i的值,对i的值进行判断)然后进入for循环体内遇到异步函数,把异步函数加入到任务池(所有异步函数都会被到这里等待立即执行代码执行过后再开始执行),然后一根筋的js继续执行for循环直到i=5;不再满足for循环的执行條件,便开始执行任务池中的异步事件(即给item元素绑定事件)
js中的函数有很多的身份上面的代码中for循环执行后,每次执行arr.push()函数把匿名函數当作值(此时函数仅仅是一段字符串而已)添加到arr数组中如此反复执行最终到i=5;for循环停止;在通过arr语句调用它之前,它仅仅是一段字苻串根本不会和i变量产生任何关系(事实上此时i也是函数字符串中的一部分);当我们调用函数,匿名函数首先在函数的作用域寻找变量i没有找到,于是开始通过作用域链向上级作用域寻找把全局总用域中的i=5赋给i ; 补充 实际上变量名仅仅是一个标识符,js通过它获取对变量值的引用;
//for循环的正常执行状况,可与上面两种情况进行比较理解
导致上面两种for循环取值问题的原因和闭包没有任何关系,真正的原因昰for循环改变了自己所在作用域里面的i变量而函数里面没有i且对for循环作用域里面的变量i的使用是在这个改变之后的;