我有一个JavaScript函数的名称作为字符串。如何将其转换为函数指针以便稍后调用?

根据具体情况,我可能还需要将各种参数传递到方法中。

一些函数可以采用namespace.namespace.function(args[…])的形式。


当前回答

人们一直说eval是危险和邪恶的,因为它可以运行任何任意的代码。然而,如果您使用白名单方法使用eval,假设您知道所有可能需要提前运行的函数名,那么eval就不再是安全问题,因为输入不再是任意的。白名单是一种良好且常用的安全模式。这里有一个例子:

函数runDynamicFn(fnName,…args) { //也可以从一个严格控制的配置 const allowedFnNames = ['fn1', 'ns1.ns2.]fn3”、“ns4.fn4 '); 返回allowedFnNames.includes(fnName) ?eval(fnName)(…args): undefined; } //测试函数: 函数fn1(a) { Console.log ('fn1 called with', a) } runDynamicFn(“警报(“有你!”)”) runDynamicFn(“fn1”、“foo”)

其他回答

基本:

var namefunction = 'jspure'; // String

function jspure(msg1 = '', msg2 = '') { 
  console.log(msg1+(msg2!=''?'/'+msg2:''));
} // multiple argument

// Results ur test
window[namefunction]('hello','hello again'); // something...
eval[namefunction] = 'hello'; // use string or something, but its eval just one argument and not exist multiple

存在其他类型的函数类,看例子

不使用eval('function()'),您可以使用new function(strName)创建一个新函数。下面的代码是使用FF, Chrome, IE测试的。

<html>
<body>
<button onclick="test()">Try it</button>
</body>
</html>
<script type="text/javascript">

  function test() {
    try {    
        var fnName = "myFunction()";
        var fn = new Function(fnName);
        fn();
      } catch (err) {
        console.log("error:"+err.message);
      }
  }

  function myFunction() {
    console.log('Executing myFunction()');
  }

</script>

所有答案都假设函数可以通过全局作用域(窗口)访问。然而,OP并没有做出这样的假设。

如果函数存在于局部作用域(即闭包)中,并且没有被其他局部对象引用,那么运气就不好了:你必须使用eval() AFAIK,参见 在javascript中动态调用局部函数

这个其他问题的答案向您展示了如何做到这一点:Javascript相当于Python的locals()?

基本上,你可以说

window["foo"](arg1, arg2);

或者像其他人建议的那样,你可以使用eval:

eval(fname)(arg1, arg2);

虽然这是非常不安全的,除非你完全确定你在评估什么。

我认为你不需要复杂的中间函数或eval,也不需要依赖像window这样的全局变量:

function fun1(arg) {
  console.log(arg);
}

function fun2(arg) {
  console.log(arg);
}

const operations = {
  fun1,
  fun2
};

operations["fun1"]("Hello World");
operations.fun2("Hello World");

// You can use intermediate variables, if you like
let temp = "fun1";
operations[temp]("Hello World");

它也可以使用导入的函数:

// mode.js
export function fun1(arg) {
  console.log(arg);
}

export function fun2(arg) {
  console.log(arg);
}
// index.js
import { fun1, fun2 } from "./mod";

const operations = {
  fun1,
  fun2
};

operations["fun1"]("Hello World");
operations["fun2"]("Hello World");

因为它使用的是属性访问,所以它将在最小化或混淆中存活下来,这与您在这里找到的一些答案相反。