JS模块模式=缓存/更好的性能?

时间:2012-11-13 18:42:24

标签: javascript performance caching module-pattern

我刚刚阅读了这篇文章http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/

在标题为"#4添加缓存"它说:

  

通过在mixins周围形成一个闭包,我们可以缓存初始定义运行的结果,并且性能影响非常明显。

我不明白这是如何工作的 - 在这里使用模块模式如何导致更快/缓存的代码版本?

3 个答案:

答案 0 :(得分:2)

基本上,不使用闭包,每次都会创建mixin函数 使用mixin的时间。通过创建一个闭包,每个函数都将是 创建一次,mixin将每次引用这些函数 调用。因为mixin不必每次都重新创建这些函数 跑步,速度更快。

没有关闭

var asRectangle = function() {
  // every time this function is called, these three functions are created
  // from scratch, slowing down execution time
  this.area = function() {
    return this.length * this.width;
  }
  this.grow = function() {
    this.length++, this.width++;
  }
  this.shrink = function() {
    this.length--, this.width--;
  }
})();

关闭

var asRectangle = (function() {
  // these functions are 'cached' in the closure
  function area() {
    return this.length * this.width;
  }
  function grow() {
    this.length++, this.width++;
  }
  function shrink() {
    this.length--, this.width--;
  }

  // this function is set to asRectangle.  it references the above functions
  // every time it is called without having to create new ones
  return function() {
    this.area = area;
    this.grow = grow;
    this.shrink = shrink;
    return this;
  };
})();

答案 1 :(得分:1)

它不是闭包或模块模式,而是它的结果:不同的构造函数/ mixin函数。而

function mixin() {
    this.method = function() { ... }
}

为每个调用创建方法的新闭包范围(mixin的执行上下文,它不包含变量 - 但需要在内存中保留)

function method() { ... }
function mixin() {
    this.method = method;
}

仅创建一个仅存在于一个范围内的函数(多次应用时)。

模块模式仅用于使method成为局部变量。

答案 2 :(得分:0)

在第二种情况下,只执行此代码:应用mixin:

this.area = area;
this.grow = grow;
this.shrink = shrink;
return this;

在第一种情况下,areagrowshrink被重新定义为每次asXXX次呼叫。方法的定义及其缓存是在第二种情况下在mixin声明的“解析”时完成的,因此只需要进行一次。