2016-04-29 4 views
0

にコンパイルされるこの活字体定数のみを使用してJavaScript関数を静的うが一定

class StaticTest_A 
{ 
    static GetConstant():number 
    { 
     return StaticTest_B.MyNumber + StaticTest_B.MyNumber; 
    } 
} 

class StaticTest_B 
{ 
    static MyNumber = 5; 
} 

から生成された次のJavaScriptは、

var StaticTest_A = (function() { 
    function StaticTest_A() { 
    } 
    StaticTest_A.GetConstant = function() { 
    return StaticTest_B.MyNumber + StaticTest_B.MyNumber; 
    }; 
    return StaticTest_A; 
})(); 
var StaticTest_B = (function() { 
    function StaticTest_B() { 
} 
StaticTest_B.MyNumber = 5; 
    return StaticTest_B; 
})(); 

コンパイルされるのでStaticTest_A.GetConstant()が一定返すまたは機能がオンに計算されますすべての呼び出し?

+3

JavaScriptでは、StaticTest_B.MyNumberが変更されないことを保証することはできませんので、関数を再評価する必要があります。 – Pointy

+0

'alert 'か何かを追加するだけで、呼び出しごとにコードが再実行され、キャッシュされていないことがわかります。 – Oriol

+0

あなたの点を参照してください..ありがとう – noontz

答えて

3

いいえ、その式は毎回実行されるため、その間にStaticTests_B.MyNumberが変更される可能性があるため、Pointyが指摘したとおりです。さらに、パフォーマンスを向上させるために、実際にはnon-goal of the compilerという文字コードをTypeScriptで変更することはありません。

パフォーマンス上の理由から一度だけ計算を実行したい場合は、そのための独自のソリューションを用意する必要があります。たとえば、最初に実行されたときに値をキャッシュし、その後にキャッシュされた値を戻す再利用可能なdecoratorを作成できます。

function methodMemoize(target: Function | Object, key: string, descriptor: TypedPropertyDescriptor<() => any>) { 
    const originalValue = descriptor.value; 
    let hasRun = false; 
    let returnedValue: any; 

    descriptor.value = function(...args: any[]) { 
     if (!hasRun) { 
      returnedValue = originalValue.apply(this, args); 
      hasRun = true; 
     } 

     return returnedValue; 
    }; 
} 

class StaticTest_A 
{ 
    @methodMemoize 
    static GetConstant() 
    { 
     console.log("run only once"); 
     return StaticTest_B.MyNumber + StaticTest_B.MyNumber; 
    } 
} 

class StaticTest_B 
{ 
    static MyNumber = 5; 
} 

StaticTest_A.GetConstant(); // "run only once", returns 10 
StaticTest_A.GetConstant(); // returns cached 10 
+0

代替ソリューションありがとう – noontz

関連する問題