在客户端,您可以通过window["functionName"](arguments);
进行操作。如何在 node.js 服务器端代码?
答案 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)
将所有方法定义为Handler的属性:
var Handler={};
Handler.application_run = function (name) {
console.log(name)
}
现在称之为
var somefunc = "application_run";
Handler[somefunc]('jerry codes');
输出:杰瑞代码
// Handler.js
module.exports={
// name_exported : internal_name
application_run = function (name) {
console.log(name)
}
}
使用Handler.js
中different.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