我试图通过评估表达式中的一个特定函数调用来模仿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";
答案 0 :(得分: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
)。
编辑:新版本可以处理多个替换。