1

この記事http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/を読みました。

「#4キャッシングの追加」というタイトルのセクションでは、次のように述べています。

ミックスインの周りにクロージャーを形成することで、最初の定義実行の結果をキャッシュでき、パフォーマンスへの影響は顕著です。

これがどのように機能するのか理解できません。ここでモジュール パターンを使用すると、コードの高速化/キャッシュ バージョンにどのようにつながるのでしょうか?

4

3 に答える 3

2

基本的に、クロージャーを使用しない場合、ミックスインが使用されるたびにミックスイン関数が作成されます。クロージャを作成することにより、各関数が1回作成され、ミックスインは呼び出されるたびにそれらの関数を参照します。ミックスインは実行するたびにこれらの関数を再作成する必要がないため、より高速になります。

閉鎖なし

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;
  };
})();
于 2012-11-13T18:56:35.587 に答える
1

これはクロージャーやモジュール パターンではなく、その結果です: 異なるコンストラクター/ミックスイン関数です。その間

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

呼び出しのたびに、メソッドの新しいクロージャー スコープ (mixin変数を含まないが、メモリに予約する必要がある の実行コンテキスト) を作成します。

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

は、1 つのスコープにのみ存在する 1 つの関数のみを作成します (複数回適用された場合)。

モジュール パターンはmethod、ローカル変数を作成するためだけに使用されます。

于 2012-11-13T19:22:37.713 に答える
0

2 番目のケースでは、次のコードのみが実行されます: mixin の適用時:

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

最初のケース areaでは、 、grow、およびshrinkは、呼び出しごとに再定義されasXXXます。メソッドの定義とそのキャッシュは、2 番目のケースでは mixin 宣言の「解析」時に行われるため、一度だけ行う必要があります。

于 2012-11-13T18:52:31.290 に答える