Es5
function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i] = (function(num){ //自我执行,并传参(将匿名函数形成一个表达式)(传递一个参数) return num; //这里的num写什么都可以 })(i); //这时候这个括号里面的i和上面arr[i]的值是一样的都是取自for循环里面的i } return arr; }
在for循环里面的匿名函数执行 return i 语句的时候,由于匿名函数里面没有i这个变量,所以这个i他要从父级函数中寻找i,而父级函数中的i在for循环中,当找到这个i的时候,是for循环完毕的i,也就是5,所以这个box得到的是一个数组[5,5,5,5,5]。
ES6
function box(){ var arr = []; for(let i=0;i<5;i++){ //使用let声明块级变量 arr[i] = function(){ return i; } } return arr; } var b = box(); alert(b[0]()); //0
function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i] = (function(num){ //自我执行,并传参(将匿名函数形成一个表达式)(传递一个参数) return num; //这里的num写什么都可以 })(i); //这时候这个括号里面的i和上面arr[i]的值是一样的都是取自for循环里面的i } return arr; }