如何向JavaScript Function构造函数注入自定义函数callpaul()?
问题分析与解决
你的问题出在传给Function构造函数的callpaul参数类型错误。
你把函数代码以字符串形式(function callpaul (p){return 'hi'+p})传入,但Function构造函数的前几个参数是「函数体内可用的变量名」,对应的实参需要是变量的实际值——这里你要传的是一个函数对象,而非字符串版的函数代码。当你传字符串时,函数体内的callpaul会变成一个字符串值,尝试调用字符串自然会触发错误。
修正后的代码如下:
let fil={} let trans={val:"fil.res=[1,2].join('&')"} console.log(`WORKS------`) Function('fil', '"use strict";return (' + trans.val + ')')(fil); console.log({fil}) console.log(`FIXED-----`) trans={val:"fil.res=callpaul('a')"} // 直接定义函数对象,而非传字符串 function callpaul(p) { return 'hi' + p } Function('callpaul','fil', '"use strict";return (' + trans.val + ')')(callpaul, fil); console.log({fil})
运行这段代码后,fil.res会被正确赋值为"hia",因为此时callpaul是一个可正常调用的函数对象,能在Function构造的函数体内执行。
如果非要用字符串形式的函数代码,你需要在Function的函数体内先将字符串解析为函数(比如用eval),但这种方式存在安全风险,不推荐使用。
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

