闭包是什么
!function(){
var a = 1
window.fn = function(){
console.log(a)
}
}()
上面代码中,在一个立即执行函数里,函数fn引用了外部变量a,那么fn和a就构成一个闭包,即闭包是「函数」以及「函数内部能访问到的变量」(也叫环境)的总和。
用途
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。
例如,为了避免变量lives被直接访问到,可将其作为一个局部变量。
通过暴露一个访问器(函数),使别人间接访问。详见代码:
!function(){
var lives = 50
window.奖励一条命 = function(){
lives += 1
}
window.死一条命 = function(){
lives -= 1
}
}()
闭包的缺点
闭包在处理速度和内存消耗方面对脚本性能具有负面影响,如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的。
例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用时,方法都会被重新赋值一次(也就是说,对于每个对象的创建,方法都会被重新赋值),造成内存占用。
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
this.getName = function() {
return this.name;
};
this.getMessage = function() {
return this.message;
};
}
避免使用闭包,修改成如下:
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
MyObject.prototype.getName = function() {
return this.name;
};
MyObject.prototype.getMessage = function() {
return this.message;
};
以上参考于方老师的「每日一题」JS 中的闭包是什么?和MDN。
完。