熟悉javascript的人应该都知道,在javascript中,有两种变量存在,即局部变量和全局变量。局部变量和全局变量之间的区别在于作用域不同。全局变量可以被任何函数调用,而局部变量只能在函数内部被调用,通常情况下在函数外部是无法调用其局部变量的,而利用闭包技术,可以做到这一点。简单来说,闭包就是能够读取其他函数内部变量的函数,也就是说,闭包是一个创建于函数内部的函数,是一个连接函数内部与外部的桥梁。
下面我用一个例子来简单解释一下:
function func1(){
var n=100;
functionfunc2(){
alert(n);
}
returnfunc2;
}
var result =func1();
result();
运行上面代码的时候可以弹出100
这就是一个最简单的闭包,这个例子当中的result函数就读取到了func1中的局部变量。
闭包还有一个作用,那就是存储变量的值,而且这些值会一直保存在内存中。
比如下面的例子:
function func1(){
var n=999;
nAdd=function(){
n+=1
}
function func2(){
alert(n);
}
returnfunc2;
}
var result=func1();
result(); //弹出999
nAdd();
result(); // 弹出1000
如此反复下去,其值会一直保存下去,而不会在每次调用之后清除。为什么会这样呢?请仔细看上面的例子,func2是func1的子函数,func2依赖于func1,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中。
由以上例子我们不难想象,闭包其实会造成内存比较大的压力,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
js闭包是js中一个比较抽象且比较难理解的一个知识点,需要一个循序渐进的过程,不理解也不要着急,如果不能准确把握闭包的写法,为了网页的性能,可以避免使用闭包,如果非得已要使用,一定记得在函数退出之前清除所有不需要用的局部变量,以防止内存泄漏。
今天就聊这么多了,周末愉快,明天我将给大家分享一个小技巧。敬请期待!
网友评论