深入理解闭包系列第四篇——常见的一个循环和闭包的错误详解
前面的话 关于常见的一个 循环 和 闭包 的错误,很多资料对此都有文字解释,但还是难以理解。本文将以 执行环境 图示的方式来对此进行更直观的解释,以及对此类需求进行推衍,得到更合适的解决办法 犯错 function foo(){ var arr = []; for(var i = 0; i < 2; i++){ arr[i] = function(){ return i; } } return arr; } var bar = foo(); console.log(bar[0]());//2 以上代码的运行结果是2,而不是预想的0。接下来用执行环境图示的方法,详解到底是哪里出了问题 执行流首先创建并进入全局执行环境,进行 声明提升 过程。执行流执行到第10行,创建并进入foo()函数执行环境,并进行声明提升。然后执行第2行,将arr赋值为[]。然后执行第3行,给arr[0]和arr[1]都赋值为一个匿名函数。然后执行第8行,以arr的值为返回值退出函数。由于此时有闭包的存在,所以foo()执行环境并不会被销毁 执行流进入全局执行环境,继续执行第10行,将函数的返回值arr赋值给bar 执行流执行第11行,访问bar的第0个元素并执行。此时,执行流创建并进入匿名函数执行环境,匿名函数中存在 自由变量 i,需要使用其作用域链匿名函数 -> foo()函数 ->