为什么需要闭包?
我们知道,对于js来说,函数内部可以访问外部的全局变量,下面这段代码会alert出10:
var n = 10;
function foo() {
alert(n);
}
foo();
但是反过来,如果我想在外面获取函数内部的值呢?如下代码:
function foo() {
var n = 10;
}
console.log(n);
肯定会报错,n未定义。
但是我就是想要这个n的值啊,你可能会说,这么折腾干嘛啊,你想要这个n,就在函数里return出来啊,整这么麻烦干嘛。
是是是,确实是这样,但是闭包还有其他的用途,比如使局部变量始终维持在内存中,来看下面这段代码:
function foo() {
var n = 10;
var bar = function() {
alert(n);
n++;
}
return bar;
}
var myFuc = foo();
myFuc();
myFuc();
上面这段代码依次alert出10
和11
,那么就可以知道n
被保存在了内存中。那么为什么呢?
你可以这么理解,在foo方法调用完毕后,按理说要把它内部的局部变量都给回收掉。但是!foo方法调用完毕后将bar方法作为返回值返回了,那么bar这个方法就还活着,而bar方法里又有变量n,所以这个n不能被销毁
综上所述, 可以知道闭包最重要的两个作用
1.在外部获取函数体内部的局部变量。
2.维持函数中的局部变量在内存中不被销毁。
什么是闭包?
抛去很多晦涩难懂的定义,我认为阮一峰老师所说的闭包是能够读取其他函数内部变量的函数
是最为简洁好理解的。拿上面的例子来说,bar函数可以读取foo函数中的变量n,bar函数就是一个闭包。可以把闭包简单的理解成定义在函数内部的函数
。另外知乎某回答也是很形象闭包就是打入敌人内部的间谍,通过他你可以接触敌人对外封锁的信息。
闭包的具体用途
看一个简单的例子:
function warnUser() {
var n = 0;
return function() {
n++;
console.log("别闹啦,你都点了" + n + "次了");
}
}
var showWarn = warnUser();
showWarn(); //"别闹啦,你都点了1次了"
showWarn(); //"别闹啦,你都点了2次了"
闭包的缺点
- 闭包会使变量保存在内存中,内存消耗大,滥用闭包会导致性能问题。
关于这篇文章
因为本人水平有限,而且不喜欢去写让人看半天也看不懂的东西,所以语言比较通俗。而通俗往往也代表着不够严谨,不够深入。所以文中有写的不对或者不合理的地方,希望大家帮忙指出。共勉
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。