Node.js中如何调用get_switch返回的函数并即时执行
如何直接执行get_switch返回的函数?
首先得说,你当前的写法有两个关键问题:一是app.js里的return语句存在语法错误(字符串没闭合),二是核心问题——你返回的是字符串形式的函数调用语句,而不是函数本身,所以没法直接执行。
最优解决方案:返回函数引用而非字符串
这是最安全、最清晰的做法,直接返回函数本身,拿到后就能立刻执行。
修改后的app.js:
global.get_switch = function(coin_name) { switch(coin_name) { case 'BTC': return get_btc; // 直接返回函数引用,不要加括号 case 'BCH': return get_bch; // 这里注意你原代码里的笔误:是get_bch不是get_bth default: console.log('default'); return null; // 返回null或者空函数,避免后续调用报错 } }
然后在demo.js里,你可以这样调用:
// 方式1:先存再执行,加判断避免报错 const targetFn = get_switch('BTC'); if (targetFn) { targetFn(); } // 方式2:更简洁的可选链写法(ES2020+支持) get_switch('BTC')?.(); // 你的函数定义 function get_btc() { console.log('btc'); } function get_bch() { console.log('bch'); }
为什么推荐这种方式?
- 完全规避了
eval带来的安全风险(如果用字符串执行的话,eval会执行任意代码,万一输入不可控就会出问题) - 代码语义更明确,直接操作函数本身,可读性更高
特殊场景:必须返回字符串的情况(不推荐)
如果因为老项目限制等原因,只能返回字符串形式的函数调用,那可以用eval来执行,但一定要确保coin_name的输入是完全可控的,避免注入风险:
修改app.js的语法错误(闭合字符串):
global.get_switch = function(coin_name){ switch(coin_name){ case 'BTC': return 'get_btc();'; // 补全字符串闭合引号 case 'BCH': return 'get_bch();'; // 修正笔误+补全引号 default: console.log('default'); return ''; } }
然后demo.js里执行:
const fnStr = get_switch('BTC'); if (fnStr) { eval(fnStr); // 仅在输入完全可控时使用! } function get_btc() { console.log('btc'); } function get_bch() { console.log('bch'); }
内容的提问来源于stack exchange,提问作者Sarus Crane
相关产品推荐
相关产品推荐

