2

他の関数はそのままにして、式で特定の関数呼び出しを評価することにより、JavaScript で遅延評価を模倣しようとしています。他の関数を評価せずに、式内の 1 つの関数だけを評価することは可能ですか (そのため、式内の他のすべての関数呼び出しはそのまま残されます)。

実装しようとしている機能は次のとおりです。

function evaluateSpecificFunction(theExpression, functionsToEvaluate){
    //Evaluate one specific function in the expression, and return the new expression, with one specific function being evaluated
}

例えば:

evaluateSpecificFunction("addTwoNumbers(1, 2) + getGreatestPrimeFactor(10)", addTwoNumbers);
//This should return "3 + getGreatestPrimeFactor(10)", since only one of the functions is being evaluated

evaluateSpecificFunction("addTwoNumbers(1, 2) + getGreatestPrimeFactor(10)", getGreatestPrimeFactor);
//This should return "addTwoNumbers(1, 2) + 5";
4

1 に答える 1

3

あなたができることは、置換と正規表現で遊ぶことです:

function getGreatestPrimeFactor(n) {
  return n*2;
}

function transform(s, f) {
  return s.replace(new RegExp(f+"\\(([^\\)]*)\\)", "g"), function(m, args) {
    return window[f].apply(null, args.split(',').map(function(v){
       return parseFloat(v)
    }));
  });
}


var result = transform(
    "addTwoNumbers(1, 2) + getGreatestPrimeFactor(10)",
    "getGreatestPrimeFactor"
);

この例では、数値パラメーターのみを扱うことを前提としています。

デモンストレーション(コンソールを開く)

もちろん、このコードの大部分はアイデアを示しています。たとえば、関数をグローバル コンテキスト ( window) ではなく、専用のオブジェクトに格納する必要があります。

EDIT : 新しいバージョンは、複数の置換を処理できます。

于 2013-05-01T18:14:13.010 に答える