2016-10-18 28 views
2

いただきました。このような関数の定義の利点:obj = { func: function(){return function func(){return this.something;};}() }Anvantage自己の呼び出し機能

ストーリー: 私はどのように軸を中心に一定の角度でThree.jsのVector3を回転させる方法を探していました。これを見つけました: How to rotate a Three.js Vector3 around an axis? 私はこの機能がどのように機能し、それを調べているかに興味がありました:https://github.com/mrdoob/three.js/blob/master/src/math/Vector3.js。関数は次のようになります。

applyAxisAngle: function() { 

    var quaternion; 

    return function applyAxisAngle(axis, angle) { 

     if (quaternion === undefined) quaternion = new Quaternion(); 

     return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 

    }; 

}(), 

このように関数を定義する理由は何でしょうか?

+0

「d」と「n」の位置を考慮すると、「利点」はいくつかのタイプミスです。 – Rajesh

+3

利点は「クォータニオン」を隠すことです。 'applyAxisAngle'はそれを使うことができますが、他の人は使用できません。 – Maxx

答えて

2

直ちに呼び出される関数式(IIFE)は、そのコードの作成者が、applyAxisAngle関数が実際にはどこでも見ることのできないようなquaternionという変数を提供することを可能にします。

var quaternion; 

// ... 

applyAxisAngle: function applyAxisAngle(axis, angle) { 

    if (quaternion === undefined) quaternion = new Quaternion(); 

    return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 
}, 

...ではなく、このすべてが表示されますスコープ内のコードでそれを共有するよりも、完全にプライベートquaternionを維持:コードは基本的にこれを行うこと

Quaternionオブジェクトは最初に呼び出されるまで構築されません。そのあと、それ以降のすべての呼び出しでその専用のquaternionの値を使用してそのオブジェクトが再利用されます。

2

実際にapplyAxisAngle()の理由は、quaternionを非公開にしないように書かれていますが、実際は実装の副作用です。

これは、メソッドが呼び出されるたびにnew Quaternion()がインスタンス化されるのを避けるために書かれており、その結果ガベージコレクションは行われません。

applyAxisAngle()はタイトなループで呼ばれることがあります。この方法でこのメソッドを記述すると、Quaternionは1回だけインスタンス化されます。

実装された構造を「クロージャ」といいます。

関連する問題