在node.js上通过(字符串)名称调用函数

时间:2011-11-21 01:50:46

标签: node.js

在客户端,您可以通过window["functionName"](arguments);进行操作。如何在 node.js 服务器端代码?

9 个答案:

答案 0 :(得分:111)

如果在模块中需要这样的功能,一个hack就是将这些模块函数存储在模块中的变量中,然后通过从模块对象属性访问它们来调用它们。例如:

var x = { }; // better would be to have module create an object
x.f1 = function()
{
    console.log('Call me as a string!');
}

现在,在模块中,您可以使用字符串中的值来调用它:

var funcstr = "f1";
x[funcstr]();

我正在学习Node自己的绳索,上面可能有各种各样的错误:-)。编写这个例子的方法可能稍微好一些(对于模块m.js):

module.exports =
{
    f1: function() { console.log("Call me from a string!"); },
    f2: function(str1) { this[str1](); }
}

现在你可以:

var m = require('m.js');
m.f2('f1');

甚至只是:

var m = require('m.js');
m['f1']();

FWIW!

答案 1 :(得分:12)

您正在寻找global

但请注意,在模块中没有任何东西暴露在这个级别

答案 2 :(得分:7)

1)如果方法在同一个js文件中

将所有方法定义为Handler的属性:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

现在称之为

var somefunc = "application_run";
Handler[somefunc]('jerry codes');

输出:杰瑞代码

2)如果要将方法保存在不同的js文件中

//    Handler.js
module.exports={
    //  name_exported : internal_name
    application_run = function (name) {
console.log(name)
}
}

使用Handler.jsdifferent.js中定义的方法:

//    different.js
var methods = require('./Handler.js')   // path to Handler.js
methods['application_run']('jerry codes')

输出:杰瑞代码

答案 3 :(得分:3)

如果您在模块范围内需要它,可以使用类似的东西

var module = require('moduleName');

module['functionName'](arguments);

答案 4 :(得分:3)

老实说,看看所有这些答案,似乎工作量太大了。我在四处寻找其他解决方法。您可以使用eval()命令将变量打印为文本,然后将其作为函数调用

let commands = ['add', 'remove', 'test'];
for (i in commands) {
    if (commands[i] == command) {
        var c = "proxy_"+command;
        eval(c)(proxy);
    }
}

eval(string)(arg1, arg2);

此示例脚本将执行功能proxy_test(proxy)

答案 5 :(得分:2)

如果您想使用this调用类级别的函数,那么以下是解决方案,它对我有用

class Hello {
  sayHello(name) {
    console.log("Hello " + name)
  }
  callVariableMethod() {
    let method_name = 'sayHello'
    this[`${method_name}`]("Zeal Nagar!")
  }
}

答案 6 :(得分:0)

我将它用于节点,看看这种方法是否适合你

var _ = require('lodash');
var fnA1 = require('functions/fnA1');
var fnA2 = require('functions/fnA2');

module.exports = {
    run: function(fnName, options, callback) { 
        'use strict';
        var nameSpace = fnName.toString().split('.');
        // if function name contains namespace, resolve that first before calling
        if (nameSpace.length > 1) {
            var resolvedFnName = this;
            _.forEach(nameSpace, function(name){
                resolvedFnName = resolvedFnName[name];
            });
            resolvedFnName(options, callback);
        } else {
            this[fnName](options, callback);
        }
    },
    fnA1: fnA1,
    fnA2: fnA2
};

称之为

importVariable.run('fnA1.subfunction', data, function(err, result){
    if (err) {return callback(err);}
    return callback(null, result);
});

答案 7 :(得分:0)

您知道,OP的代码启发了我尝试这样做:

global.test = function(inVal){
    console.log(inVal);
}

global['test']('3 is the value')

但是现在我想到了,这并不比@Ravi的答案好。

答案 8 :(得分:-1)

这不是特定于窗口对象的。在JavaScript中,可以通过这种方式访问​​对象的任何属性。例如,

var test = {
    prop1 : true
};

console.log(test.prop1); // true
console.log(test["prop1"]); // also true

在此处阅读更多内容:https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects