作用域
要想理解什么是闭包就必须知道作用域的概念。
变量的作用域无非就是两种:全局变量和局部变量。
但是我们可以在任何地方访问全局变量。但是局部变量形成的作用域只能在代码块内访问。例如:
function f1(){
var b=2;
}
f1();
console.log(b)
这里我们在外界是无法访问b的,因为b定义在函数里边
所以如果想访问这个变量,该怎么做呢
不妨在函数内部在顶一个函数
function f1(){
var b=2;
var c = funtion(){
console.log(b)
}
return c ;
}
var d = f1();
d();
由于函数c是f1的子函数,所有他可以访问到f1内部变量
将它作为返回值保存到外部,那不就可以访问到变量了吗。
闭包的概念
我的理解来说,闭包就是能够读取其他函数内部变量的函数。
标题 闭包用途:
- 实现累加器
function a() {
var num = 100;
function add() {
num++;
console.log(num);
}
return add;
}
var demo = a();
demo(); // 101
demo(); // 102
- 实现给定时器传参
function func(param) {
return function () {
alert(param)
}
}
var f1 = func(1);
setInterval(f1, 1000);
缺点
- this指向改变
var name = outer;
var object = {
name: ''inner",
getName: function() {
return function() {
console.log(this.name)
}
}
}
object.getName()() // outer
// 因为里面的闭包函数是在window作用域下执行的,也就是说,this指向windows
- 内存泄露问题
由于变量被保存到外部,导致作用域链无法释放,会使变量一直存在于内存中。所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。