javascript映射函数的包装器

javascript映射函数的包装器,javascript,dependency-injection,parameter-passing,eval,wrapper,Javascript,Dependency Injection,Parameter Passing,Eval,Wrapper,我有两个javascript函数stack(y,f)和val(yi,x) 堆栈(y,f)的行为如下 y.map(函数(yi){f}) 它返回一个数组r,其中每个元素r[i]是数组参数y[i]的对应元素的函数,表达式f作为第二个参数传递 f可以是任何计算为单个值的javascript代码,但是,如果它依赖于函数val,则该函数将依赖于y[i] [r[0],r[1],…]=堆栈([y[0],y[1],…]),foo(val(y[i],x1),val(y[i],x2),…) 我考虑了以下丑陋的方法,其

我有两个javascript函数stack(y,f)和val(yi,x)

堆栈(y,f)的行为如下
y.map(函数(yi){f})

它返回一个数组r,其中每个元素r[i]是数组参数y[i]的对应元素的函数,表达式f作为第二个参数传递

f可以是任何计算为单个值的javascript代码,但是,如果它依赖于函数val,则该函数将依赖于y[i]

[r[0],r[1],…]=堆栈([y[0],y[1],…]),foo(val(y[i],x1),val(y[i],x2),…)

我考虑了以下丑陋的方法,其中我将表达式作为字符串传递,并在循环中替换字符串,然后对其求值。

我想知道您是否可以看到任何更干净的解决方案,在理想情况下,我可以避免对字符串表达式求值。另一种选择是,如果val检测到stack是它的一个远程父级,那么它就已经返回了一个数组,但是获取调用stack和y似乎并不简单

任何更干净的解决方案,在理想情况下,我将避免对字符串表达式求值

简单,只需使用函数即可。您消除了非常容易出错的字符串,使代码更易于维护,并且更易于阅读和理解

字符串
“foo(val(yi,3)、val(yi,4)、val(yi,5))”
可以转换为函数:

函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5));
}
当被调用而不是替换字符串
yi
时,现在您只需传入它,所以

eval(f.replace(/yi/g,yi));
转化为简单的

f(yi);
以下是此转换的外观:

函数val(yi,x){
返回10**yi+x;
}
函数foo(x1,x2,x3){
返回x1+x2+x3;
}
函数堆栈(y,f){
返回y.map(函数(yi){
返回f(yi);
})
}
console.log([1,2].map(函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>> [42, 312]
log(堆栈([1,2],函数(yi)){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>>[42312]
任何更干净的解决方案,在理想情况下,我将避免对字符串表达式求值

简单,只需使用函数即可。您消除了非常容易出错的字符串,使代码更易于维护,并且更易于阅读和理解

字符串
“foo(val(yi,3)、val(yi,4)、val(yi,5))”
可以转换为函数:

函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5));
}
当被调用而不是替换字符串
yi
时,现在您只需传入它,所以

eval(f.replace(/yi/g,yi));
转化为简单的

f(yi);
以下是此转换的外观:

函数val(yi,x){
返回10**yi+x;
}
函数foo(x1,x2,x3){
返回x1+x2+x3;
}
函数堆栈(y,f){
返回y.map(函数(yi){
返回f(yi);
})
}
console.log([1,2].map(函数(yi){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))
//>> [42, 312]
log(堆栈([1,2],函数(yi)){
返回foo(val(yi,3),val(yi,4),val(yi,5))
}))

//>>[42312]
我不明白为什么不传递一个函数<代码>“foo(val(yi,3),val(yi,4),val(yi,5))”->
函数(yi){返回foo(val(yi,3),val(yi,4),val(yi,5))}
太棒了!非常感谢你!我不明白为什么不传递一个函数呢<代码>“foo(val(yi,3),val(yi,4),val(yi,5))”->
函数(yi){返回foo(val(yi,3),val(yi,4),val(yi,5))}
太棒了!非常感谢你!
function val(yi,x) {
    return 10**yi+x;
}

function foo(x1,x2,x3) {
    return x1+x2+x3;
}

function stack(y,f) {
    return y.map(function(yi) {
        return eval(f.replace(/yi/g, yi));
    });
}

console.log([1,2].map(function(yi) {
  return foo(val(yi,3),val(yi,4),val(yi,5))
} ))
>> [42, 312]

console.log(stack([1,2], "foo(val(yi,3),val(yi,4),val(yi,5))"))
>> [42, 312]