一,闭包的定义
**通俗点来说闭包就是能够读取其他函数内部变量的函数。**或者说闭包是指有权访问另一个函数作用域中的变量的这么一个函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
需要理解的是,闭包存在于嵌套的内部函数中。
二,闭包产生的条件
函数嵌套----内部函数引用了外部函数的数据(变量/函数)
三,闭包的使用
下面先简单列举两个关于JavaScript中全局变量和局部变量的小Demo:
1,var count = 0;
function add() {
return count++;
}
console.log(add()); // 0
console.log(add()); // 1
console.log(add()); // 2
以上代码执行结果说明:全局变量会降低函数的独立性,每一次调用add()函数都会将全局变量count做一个修改,得到一个新的数据。
2,function add(){
var count = 0;
return count++;
}
console.log(add()); // 0
console.log(add()); // 0
console.log(add()); // 0
以上代码执行结果说明:局部变量在函数体执行结束以后数据会被销毁,因此count++操作每次执行完以后对count的值做修改,由于此时count是局部变量,所以修改以后的值会被销毁。
由此为了解决可以在函数体外部访问函数体内部局部变量,就要用到闭包。
3,使用闭包
简单(易懂)写法:
function add(){
var count = 0;
function plus(){
return count++;
}
return plus;
}
var f = add();
console.log(f()); // 0
console.log(f()); //1
console.log(f()); //2
以上代码说明:
plus定义在add的内部,可以访问add局部变量count
f为一个全局变量,通过赋值后,成为add的返回值,也就是plus方法
访问到了add中的局部变量count
所以count虽然是局部变量,但不允许被销毁,plus就是闭包
最终写法:
var f = (function() {
var count = 0;
return function() {
return count++;
}
})();
console.log(f()); // 0
console.log(f()); // 1
console.log(f()); // 2
四,闭包的特点
让局部变量始终保存在内存中。
五,闭包的优缺点
优点:
可以读取函数内部的变量
让这些变量的值始终保持在内存中。
增加块级作用域
缺点:
由于内部变量数值一直存储在内存中,占用了内存空间,会降低页面的性能,甚至使用不当会造成内存泄漏(在IE中)。
六,总结
闭包的使用有好处也有坏处,所以我的建议是当我们遇到有需要必须使用闭包的情况下解决问题时再去使用,尽量少用闭包,不要滥用闭包。