JS闭包

235 阅读1分钟

闭包是什么

!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。

完。