JavaScript 闭包浅谈
解释:
能够访问另一个函数作用域的变量的函数,(即重用一个变量,又保护变量不被污染的一种机制。)
(闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。)
优点:
1、读取函数内部的变量;
2、这些变量的值始终保持在内存中(长期驻扎),不会在外层函数调用后被自动清除。
3、避免全局变量的污染;
4、私有成员的存在
缺点:
1、常驻内存 会增大内存的使用量 使用不当会造成内存泄露
解释:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、闭包会在父函数外部,改变父函数内部变量的值。
//解决方法
闭包不在使用时,要及时释放。(将引用内层函数对象的变量赋值为null。)
实例1(简单创建闭包):
function outFun() {
var a = 'variable'
var inFun = function () {
console.info(a)
}
return inFun// inFun就是一个闭包函数,因为他能够访问到outFun函数的作用域中的变量
}
实例2(普通函数和闭包创建计数器比较):
//普通函数
var count = 0;
function add() {
count = count + 1;
console.log(count);
}
add(); //实现了需求,但是当计算器在增加时就不行了
//闭包,
function addCount() {
var conut = 0;
return function() {
count = count + 1;
console.log(count);
};
}
var fun1 = addCount();
fun1(); //1
fun1(); //2
var fun2 = addCount();
fun2(); //1
fun2(); //2
//addCount() 执行的时候, 返回一个函数, 函数是可以创建自己的作用域的, 但是此时返回的这个函数内部需要引用 addCount() 作用域下的变量 count, 因此这个 count 是不能被销毁的.接下来需要几个计数器我们就定义几个变量就可以,并且他们都不会互相影响,每个函数作用域中还会保存 count 变量不被销毁,进行不断的累加
小弟是新手,如有不对,欢迎评论