于是在网上找了一些文章,发现网上大致有2
种说法:
- 闭包必须返回嵌套函数中里面用到外面函数局部变量的函数才叫闭包,两个条件:
- 嵌套函数中,内部函数用到外部函数的局部变量
- 内部函数必须
return
出来
- 还有一些文章认为,只要函数嵌套,内部用到外部函数的局部变量,就是闭包,不一定必须要返回内部函数。
在看看《JavaScript高级程序设计(第四版)》第309页中对闭包的定义:
闭包指的是那些引用了另外一个函数作用域中的变量的函数
这里没有提到这个函数必须return
出来,但是大部分时候都会return
出来。
这下真相大白了,闭包也是一个函数,只不过这个函数比较特别,他有权限访问另外一个函数作用域中的变量,一般会被return
到外部,导致原有的作用域链该释放的时候不释放。
闭包在实际项目中的应用,说白了就是一个函数需要频繁的操作一些变量,但是这些变量如果声明函数中,在函数每次执行时,都要重新声明、重新分配内存空间,一来麻烦,二来消耗内存,但是设置成全局变量又会污染全局变量,自然外面套一层函数的形式就出来了,这就是闭包。
外面套一层函数形成闭包带来新的两个问题:
- 内部函数受到外层函数的限制,不够灵活了
- 外层函数加上后,感觉又出现新的函数变量,我不想存储
那怎么办?
大家很快想到,形成闭包之后,内部原本的函数需要保证本来的灵活性,不受外层函数作用域的影响和限制,那就把内部函数return
到外面。
而外层函数不想用变量存储,只想单独的运行1次,那就利用立即执行函数的方式来解决。
那么最终会看到我们现在比较常见的形式:
//例如:实现累加器
var temp = (function outer() {//outer名字可以省略
var num = 0;
function inner() {
console.log(++num);
}
return inner;
}());
temp();
temp();
temp();
所以闭包解决一个很大的问题,它可以防止污染全局变量。
网友评论