На стороне клиента вы делаете это через window["functionName"](arguments);
. Как это возможно в node.js серверном коде?
Вызовите функцию именем (string) на node.js
Ответ 1
Вы ищете global
Обратите внимание, однако, что в модулях ничто никогда не подвергается этому уровню
Ответ 2
Если вам нужна такая возможность в модуле, один взлом - это хранить такие функции модуля в переменных внутри модуля, а затем вызывать их путем доступа к ним из свойств объекта модуля. Пример:
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!
Ответ 3
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={
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')
Вывод: Джерри Коды
Ответ 4
Если вы хотите вызвать функцию уровня класса, используя this
то вот решение, и это сработало для меня
class Hello {
sayHello(name) {
console.log("Hello " + name)
}
callVariableMethod() {
let method_name = 'sayHello'
this['${method_name}']("Zeal Nagar!")
}
}
Ответ 5
Если вам нужно это в области модуля, вы можете использовать что-то вроде этого
var module = require('moduleName');
module['functionName'](arguments);
Ответ 6
Честно говоря, глядя на все эти ответы, они кажутся слишком много работы. Я играл вокруг, чтобы искать другие способы обойти это. Вы можете использовать команду 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)
Ответ 7
Вы знаете, код OP вдохновил меня попробовать это:
global.test = function(inVal){
console.log(inVal);
}
global['test']('3 is the value')
Но теперь, когда я думаю об этом, это не лучше, чем ответ @Ravi.
Ответ 8
Я использую это для node, см., работает ли этот подход для вас
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);
});
Ответ 9
Это не относится к объекту окна. В 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