闭包问题详解
一.闭包
特点:-
- 让外部访问函数内部变量成为可能;
- 局部变量会常驻在内存中;
- 可以避免使用全局变量,防止全局变量污染;
-
- 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)
-
- 实现变量的私有化
- 节流防抖函数等
function A(){ var age = 10; return function(){ return age; } } var b = A(); b();当A调用完毕后,按照正常情况,函数执行完毕,变量对象会被销毁。 但是这个例子中,匿名函数引用了A函数中的 age变量,即当A函数执行完毕,因为A函数的变量对象被匿名函数所引用,JS的垃圾回收是引用计数机制。所以A函数的变量对象不会被销毁。只有当匿名函数销毁时,没有了对A函数的变量对象的引用时,A函数的变量对象才会被销毁。 简单例子2
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } //result: 10 10 10 ... function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(num){ return function(){ return num; } }(i); return result; } } //return:1 2 3 ...
这个例子,也是闭包的典型例子,不过它主要是因为函数参数的值传递。由于函数参数是按值传递的,所以就会将变量 i 的当前值复制给参数 num。而在这个 匿名函数内部,又创建并返回了一个访问 num 的闭包。这样一来,result 数组中的每个函数都有自己 num 变量的一个副本,因此就可以返回各自不同的数值了。