繁体   English   中英

模块内部动态定义的 function 调用

[英]Dynamicly defined function call inside module

'interpret'中有一个代码,问题:如何从'func'内部调用任何给定的function,而不仅仅是'sum3'?

const sum = (...args) => {
    return args.reduce((prev, curr) => prev + curr)}

const defn = (functionName, args, body) => {
    let [func, ...params] = body;
    let result = `var ${functionName} = function(${args.join(',')}) { return ${func.name}(${params.join(',')})}`
    return result;
}

const interpret = (...code) => {
    let [dfStr, callString] = code;
    let [func, ...args] = callString;
    eval(dfStr[0](dfStr[1], dfStr[2], dfStr[3] ));
    return sum3.apply(this, args);
    }


const result = interpret(
    [defn, "sum3", ['a', 'b', 'c'], [sum, 'a', 'b', 'c']],
    ['sum3', 10, 20, 30]
)

请注意,您评估的是 function 定义,而不是相应的调用,

看一下这个:

 const sum = (...args) => { return args.reduce((prev, curr) => prev + curr) } const defn = (functionName, args, body) => { let [func, ...params] = body; let result = `var ${functionName} = function(${args.join(',')}) { return ${func.name}(${params.join(',')})}` return result; } const interpret = (...code) => { let [dfStr, callString] = code; let [func, ...args] = callString; eval(dfStr[0](dfStr[1], dfStr[2], dfStr[3])); return eval(`${func}.apply(this, args)`); } const result = interpret( [defn, "sum3", ['a', 'b', 'c'], [sum, 'a', 'b', 'c'] ], ['sum3', 10, 20, 30] ) console.log(result)

TBH 我不知道您要做什么,但请记住,使用 eval 是一种邪恶的做法。 也许你可以想出一个更清洁的解决方案来满足这个目的。

更新

 const sum = (...args) => { return args.reduce((prev, curr) => prev + curr) } const defn = (functionName, args, body) => { let [func, ...params] = body; let result = `(${args.join(',')}) =>${func.name}(${params.join(',')})` return result; } const interpret = (...code) => { let [dfStr, callString] = code; let [func, ...args] = callString; return eval(dfStr.shift()(...dfStr)).apply(this, args) } const result = interpret( [defn, "sum3", ['a', 'b', 'c'], [sum, 'a', 'b', 'c'] ], ['sum3', 10, 20, 30] ) console.log(result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM