再看函数的闭包

 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();
原文地址:https://www.cnblogs.com/chuyu/p/3370460.html