说实话其实一直不懂闭包这个东西,不过现在看招聘要求上都是要求懂js闭包,面向对象。es6语法。等等要求。其实我才刚刚看完es6的语法还没有进行过实际的练手,而且现在浏览器对es6的语法也不是全支持需要插件或者是打包工具来转成es5。哈哈哈,我们还是来言归正传说回我们的闭包。对于闭包这个概念我个人觉得最容易理解的还是阮一峰老师的:闭包就是能够读取其他函数内部的函数。但是在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以将闭包理解成‘定义在函数内部的函数’。所以,在本质上,闭包的作用就是将内部函数与外部函数连接起来的一座桥梁。
闭包的用途:
(1)读取函数内部的函数;
(2)让变量的值始终保持在内存中。
下面先来一个简单的闭包
1.
function test1(){
function test2(){
console.log('我家有只可爱的皮皮猫哦!')
}
return test2;
}
var a=test1();
a();
1,定义了一个普通的函数test1;
2,定义了一个普通函数test2;
3,在函数test1中返回函数test2;
4,执行test1把test1的结果赋值给变量a;
5.执行a;
上面说到了闭包的两个作用其中一个作用是让让变量的值始终保持在内存中,说道这里那我们就需要知道js的G机制了:在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收了,否则的话这个对象会一直保存在内存中。
上面的例子test2定义在test1中,因此test2依赖test1,二外部变量a又引用了test2,所以间接的引用了test1,也就说明了GC不会回收test1.下面继续看个例子
function test1(){
var i=0;
function test2(){
i++;
console.log(i);
}
return test2;
}
var a=test1();
a();
a();
i在test1中定义的一个变量,它的值在test2中改变,test2每执行一次,i的值就会在原来的基础上增加1,所以test1会一直存在再变量中。
当然使用闭包也得注意
由于闭包的使用会导致很多函数的变量保存在内存中,内存消耗比较大,所以不能滥用闭包,最好是在退出函数之前将不用的变量全部删除。