再看函数的闭包
1 function createFunctions(){ 2 3 var result = []; 4 5 for(var i = 0; i < 10; i++){ 6 result[i] = function(){ 7 return i; 8 }; 9 console.log(i); 10 } 11 console.log("最终i : ", i); 12 13 //return result; 14 console.log(result[0]());// 10 15 console.log(result[1]());// 10 16 console.log(result[2]());// 10 17 console.log(result[3]());// 10 18 console.log(result[4]());// 10 19 console.log(result[5]());// 10 20 console.log(result[6]());// 10 21 console.log(result[7]());// 10 22 console.log(result[8]());// 10 23 console.log(result[9]());// 10 24 console.log(result[10]);// undefined 25 } 26 27 createFunctions();
内存中仅保存全局作用域,但是闭包的情况有所不同!
我们知道,函数在执行结束之后局部变量就会被回收,(全局作用域,本地活动对象)。以上为例,最终的i值没有被销毁,为 10. 所以result 中引用的i 一直是 10。
但是通过改写:
1 function createFunctions(){ 2 3 var result = []; 4 5 for(var i = 0; i < 10; i++){ 6 result[i] = (function(num){ 7 return function(){ 8 return num; 9 }; 10 })(i); 11 console.log(i); 12 } 13 console.log("最终i : ", i);// 10 14 15 //return result; 16 console.log(result[0]());// 0 17 console.log(result[1]());// 1 18 console.log(result[2]());// 2 19 console.log(result[3]());// 3 20 console.log(result[4]());// 4 21 console.log(result[5]());// 5 22 console.log(result[6]());// 6 23 console.log(result[7]());// 7 24 console.log(result[8]());// 8 25 console.log(result[9]());// 9 26 console.log(result[10]);// undefined 27 } 28 createFunctions();
上面代码相当于:
1 function createFunctions(){ 2 3 var result = []; 4 5 for(var i = 0; i < 10; i++){ 6 result[i] = (function(num){ 7 num = i; 8 return function(){ 9 return num; 10 }; 11 })(); 12 console.log(i); 13 } 14 console.log("最终i : ", i);// 10 15 16 //return result; 17 console.log(result[0]());// 0 18 console.log(result[1]());// 1 19 console.log(result[2]());// 2 20 console.log(result[3]());// 3 21 console.log(result[4]());// 4 22 console.log(result[5]());// 5 23 console.log(result[6]());// 6 24 console.log(result[7]());// 7 25 console.log(result[8]());// 8 26 console.log(result[9]());// 9 27 console.log(result[10]);// undefined 28 } 29 createFunctions();
疯癫不成狂,有酒勿可尝;世间良辰美,终成水墨白。