闭包
定义
拥有作用域的代码块,js代码在script作用域中,所以代码块一般都是闭包。但闭包的解释我们一般用于函数中。
函数闭包
闭包格式
function fx() {
var a = 1;
function fn() {
console.log(a);
}
return fn;
}
var fg = fx();
特点
1.函数嵌套函数
function fx(){
function fn(){}
return fn
}
var fg=fx()
2.内层函数可以访问外层函数的参数和变量
function fx(){
var a= 1
function fn(){
console.log(a);
}
return fn
}
var fg = fx()
fg()//1
这里的fn没有自己的局部变量,所以会优先访问外层函数的变量,所以fn可以使用父函数fx声明的变量a。
作用
1.防止变量和参数被垃圾回收机制回收(变量持久化)
function fx() {
var a = 1;
function fn() {
console.log(a);
}
fn();
return fn;
}
var fg = fx();//fg的值就相当于fx return的函数即fn
fg();//1 fg()相当于fn()
fg();//1 同上,fx中的变量a没有被销毁
2.防止全局污染(变量只在闭包内部可访问)
(1)当没有进行闭包时
var a=1
function fx() {
a++
console.log(a);
}
fx()//2
fx()//3
fx()//4
如果还有其他函数用到了a值,则会受到污染,而且全局变量容易被修改不安全。
(2)进行了闭包
function fx() {
var a=1
function fn() {
a++
console.log(a);
}
return fn
}
var fg = fx()
fg()//2
fg()//3
fg()//4
这样变量a在函数内部不易被修改和污染。
缺点
1.变量不会被垃圾回收机制回收,造成内存的消耗
function fx() {
var a = 1;
function fn() {
console.log(a);
}
fn();
return fn;
}
var fg = fx();//fg的值就相当于fx return的函数即fn
fg();//1 fg()相当于fn()
fg();//1 同上,fx中的变量a没有被销毁
这里的变量a一直储存在fx中。
2.不恰当的使用闭包可能造成内存泄漏
闭包外面的变量不会被销毁,因为函数会一直被调用,当闭包过多内存就会销毁。
解决方案:1.不使用闭包
2.可将内存函数对象的变量赋值为null
function fx() {
var a = 1;
function fn() {
console.log(a);
}
fn();
return fn;
}
var fg = fx();
fg();//1
fg();//1
a=null
fg();