在Javascript中动态调用函数

Call function dynamically in Javascript

本文关键字:调用 函数 动态 Javascript      更新时间:2023-09-26

我想从"User.fund"这样的字符串中动态调用一个函数。如果函数存在,脚本会调用对象User中的函数find()。以下是我尝试过的:

 var User = {};
 User.find = function(){
     return 1;
 }
 var input = 'User.find';
 var some_data_array = {name: 'John Doe'};
 var method = input.toString().split('.');
 var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
 var methodToCall = method[1];
 nameObj.call(methodToCall, some_data_array);

但它总是回来:

 nameObj.call(methodToCall, some_data_array);
 TypeError: Object User has no method 'call'

知道吗?我不能使用window,因为这是node.js的问题,脚本没有在浏览器中执行。

您完全误解了call()

使用call()可以调用具有不同this的方法。

您想按名称获取属性:

object[methodName](arg1, arg, ...);

您实际上可以实现这一点。您首先需要获得scope,其中定义了名称空间/函数/对象。

例如,在您的代码中,我假设它是window

因此,对代码进行一点修改就会产生所需的结果:

var User = {};
User.find = function(x){
    alert(x);
}
 var input = 'User.find';
 var some_data_array = {name: 'John Doe'};
 var method = input.toString().split('.');
 var nameObj = global[method[0]];
 var methodToCall = method[1];
 nameObj[methodToCall](some_data_array.name);

标记global[]的使用。这就是它的起点。

[edited]*修改代码,使用global,而不是nodejs中使用的window

您想要做的是访问全局对象。

这应该有效:

var User = {};
User.find = function(){
    return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() +method[0].substring(1);
var methodToCall = method[1];
"use strict";
var global = (1,eval)("this");
alert(global[nameObj][methodToCall](some_data_array));

有几种方法可以获得所需的结果。在这种情况下,只需使用匿名函数非常简单,如下所示,传入objName.name:中包含的字符串参数

var f = function(oName){
  if (oName == 'John Doe') {
     return 1;
  }   
 };
 var objName = {name: 'John Doe'};
 
console.log( f( objName.name ) );

如果OP更喜欢使用对象的调用方法,那么以下代码也就足够了:

var myObj = {
  myFunc: function() {
    if (this.name == 'John Doe') {
      return 1;
    }
  }
}
var objName = {
  name: 'John Doe'
};
console.log(myObj.myFunc.call(objName));

有几点需要注意。myObj通过对象参数objName调用其方法myFunc()。方法中this的目的是读取属性name,由于绑定到对象objName而具有该能力。