2016-05-24 16 views
0

アンダースコアのメモ機能を実装しようとしています。引数から渡された関数からパラメータを引き出す

次のようにMemoizeが呼び出される必要があります。Memoizeは以前その保存された関数の呼び出し、およびなく、再計算(再実行機能)「を覚えている」必要があります

subtract = function(a, b) { 
    return a - b; 
}; 

memoSub = _.memoize(subract); 
memoSub(2, 1); 
//1 

、それは、これらの保存された値を返す必要があります。

私は次のような構造を設定しましたが、難しいのは、渡された関数のパラメータにアクセスして何らかの形で保存できるようにして、以前と同じかどうかを確認することです渡されたパラメータ。

以下は本質的に_.onceの実装であり、渡された関数の引数にはアクセスする必要はありません。私は_.memoize

_.memoize = function(func) { 

    var called = false; 
    //i'd rather this be var storedArgs = {}; 
    var result; 

    return function() { 
     //i'd rather be checking if these args have been seen before 
     if (!called) { 
     result = func.apply(this, arguments); 
     called = true; 
     //i'd rather save the computed results to the storedArg obj here 
     } 
     return result; 
    }; 
    }; 

func.applyにそれを作るために、それを修正しようとしている私は、すなわち、自分の関数定義のfunc後のすべてを関数を呼び出すと、マスターargumentsに渡すことができますが、どのように、私はアクセスすることができますパラメータ/引数func?上で見たよう(この場合のパラメータは(a, b)ある

編集:私は本当に何をする必要があるか疑うここに存在しないパラメータを何とかアクセスされています

return function(/*how can I "capture" what will go here?*/) {...} 
+0

'result = func.apply(this、arguments);'は、あなたがラップしている関数に 'arguments'を送ります。キャプチャするために他に何が必要ですか?あなたはすでに 'arguments'を持っています。 – zzzzBov

答えて

1

あなたはすでにあなたの答えを持っています、

内部関数と外部関数の両方に引数変数がありますが、内部関数に入ると外部変数はシャドーイングされますが、内部変数はシャドウイングされます。

+0

ので:そのような ' ' _.memoize =機能(FUNC){返される関数 } ためmemoize リターン機能について //引数=引数(){//引数 =引数}? –

1

あなたはすでにargumentsで引数にアクセスできます。あなたが必要とするのは、引数の結果へのマッピングです。マップに現在渡されている引数のエントリが含まれている場合は、結果を返します。そうでない場合は、計算して保存します。

例:

var results = {}; 
return function() { 
    var key = Array.prototype.join.call(arguments); 
    if (!(key in results)) { 
    return results[key] = func.apply(this, arguments); 
    } 
    return results[key]; 
}; 

注:これは、引数の非常に単純な直列化を行い、複雑な引数(オブジェクト)のために動作しないでしょう。

関連する問題