1)什么是闭包?
当一个函数里面返回另一个函数的形式,就称为闭包。
eg:
function fn() {
var a = 1;
return function() {
return a;
}
}
var b = fn();
console.log(b());// 1
2)闭包的作用:打破函数作用域的限制,当前函数的作用域外访问函数内部的私有成员,延长变量的声明周期。
3)特点:
①打破了作用域的限制,让全局访问局部变量成为可能。
②局部变量常驻内存中------》内存空间长期被占用(弊端),会造成内存泄漏(有一块内存空间被长期占用,而不被释放)。
③归根结底还是局部变量------》防止了全局变量的污染。
4)应用场景
场景一:模块封装,防止变量污染全局
var Mokuai = (function(){
// 声明为模块私有变量,外界无法直接访问
var foo = 0;
function Mokuai(){}
Mokuai.prototype.bar = function bar(){
return foo;
}
return Mokuai;
}());
场景二::在循环中创建闭包,防止取到意外的值
eg:无论哪个元素触发事件,都会弹出5。因为函数执行后引用的i是同一个,而i在循环结束后就是5。
for(var i = 0;i<5;i++){
document.getElementById('id'+i).onfocus = function(){
alert(i);
}
}
// 可用闭包解决
function makeCallback(num){
return function(){
alert(num);
}
}
for(var i = 0;i<5;i++){
document.getElementById('id'+i).onfocus = makeCallback(i);
}
网友评论