在Javascript中动态调用函数

时间:2014-10-12 18:04:36

标签: javascript node.js

我想从像“User.find”这样的字符串动态调用函数。如果函数存在,脚本将在对象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'

有什么想法吗?我不能使用窗口,因为它是node.js问题,脚本不在浏览器中执行。

4 个答案:

答案 0 :(得分:8)

您完全误解了call()

call()可让您调用具有不同this的方法。

您希望按名称获取财产:

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

答案 1 :(得分:1)

你实际上可以做到这一点。首先需要获取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[]的使用。这就是它开始的地方。

[已编辑] *使用global代替window的修改代码,用于nodejs

答案 2 :(得分:0)

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

这应该有效:

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));

答案 3 :(得分:0)

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

var f = function(oName){
  if (oName == 'John Doe') {
     return 1;
  }   
 };


 var objName = {name: 'John Doe'};
 
console.log( f( objName.name ) );

如果OP偏爱使用对象的call方法,则以下代码也将足够:

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

var objName = {
  name: 'John Doe'
};

console.log(myObj.myFunc.call(objName));

需要注意的几件事。 myObj调用其方法myFunc()并传入对象参数objName。该方法中的 this 的目的是读取属性 name ,该属性具有绑定到对象objName的能力。