不活性関数定義モード使用方法1/3ページ


この文章は関数式プログラミングの設計モードを述べています。私は不活性関数定義と言います。 Function Definition。私はこのようなモードがJavaScriptの中で大いに役に立つことを発見したばかりでなく、特にブラウザを跨いで、効率的に運行するライブラリを作る時。ウォームアップの問題は、関数fooを作成し、それはDateオブジェクトを返します。このオブジェクトはfooの最初の呼び出しの時間を保存します。方法1:上古時代の技術という最も粗末な解決策は大域変数tを使ってDateオブジェクトを保存します。fooは最初の呼び出し時にtに時間を保存します。次の再起動は、fooはtに保存されている値だけを返します。

var t; 
function foo() { 
    if (t) { 
        return t; 
    } 
    t = new Date(); 
    return t; 

ですが、このようなコードには2つの問題があります。第一に、変数tは余分なグローバル変数であり、 foo呼び出しの間隔は期間中に変更される場合があります。第二に、呼び出し時にこれらのコードの効率は最適化されていません。 fooは条件を求めに行かなければなりません。この例では、値を求める条件は非効率的ではないが、現実世界の実践例では、if-else-else-のような極めて高価な条件求値がしばしばある。方法二:モジュールモードはCornfordのおかげと考えられます。 和 Crock ford のモジュールモードを使用して、第一の方法の欠陥を補います。閉じたパケットを使うと、グローバル変数tは非表示になります。 foo内のコードだけがアクセスできます。

var foo = (function() { 
    var t; 
    return function() { 
        if (t) { 
            return t; 
        } 
        t = new Date(); 
        return t; 
    } 
})(); 
しかし、これは依然として呼び出し時の効率を最適化していない。なぜなら、fooを呼び出すたびに値を求める条件が必要であるからである。モジュールモードは強力なツールですが、この場合は間違ったところを使っていると確信しています。方法3:関数は対象としてJavaScriptの関数も対象ですので、属性を持つことができます。これによってモジュールモードと同じ品質のソリューションを実現できます。

function foo() { 
    if (foo.t) { 
        return foo.t; 
    } 
    foo.t = new Date(); 
    return foo.t; 

は、いくつかの場合、属性を有する関数オブジェクトが、より明確な解決策を生成することができる。この方法はモデルモジュールの方法よりも理念的に簡単だと思います。この解は第一の方法で大域変数tを回避したが、fooが呼び出しごとにもたらす条件の求め値を解決することはできなかった。
1 2 3 次のページ 全文を読む