2013-05-01 2 views
2

Я пытаюсь подражать ленивой оценке в JavaScript, оценивая один конкретный вызов функции в выражении, оставляя другие функции как есть. Можно ли оценивать только одну функцию в выражении без оценки других функций (так что все остальные вызовы функций в выражении остаются как-есть)?Оценить одну конкретную функцию в операторе JavaScript

Вот функция, которую я пытаюсь выполнить:

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"; 
+2

Вам нужно будет провести синтаксический анализ здесь или использовать замену. –

+0

вы можете проанализировать строку param1 –

+0

@MikeHometchko Какая строка является «строкой param1»? –

ответ

3

Что вы можете сделать, это играть с replace и регулярным выражением:

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" 
); 

В этом примере предполагается, что вы имеете дело только с числовыми параметрами.

Demonstration (open the console)

Конечно, этот код в основном демонстрируют идею, вы должны, например, хранить функции в выделенном объекте, а не глобальный контекст (window).

EDIT: новая версия может обрабатывать более одной замены.

+0

Почему бы просто не использовать 'return eval (m);'? Здесь может быть уместно. И, кстати, ваше регулярное выражение плохо связано с вложенными выражениями :-) – Bergi

+0

@Bergi: Потому что 'window [f]' может быть быстрее, чем 'eval'. –

+0

@Bergi Работа с вложенным выражением подразумевала бы разбор выражения, а не только воспроизведение с регулярным выражением. И когда я могу избежать «eval», я избегаю этого ... –

Смежные вопросы