Подтвердить что ты не робот

Вызовите функцию именем (string) на node.js

На стороне клиента вы делаете это через window["functionName"](arguments);. Как это возможно в node.js серверном коде?

4b9b3361

Ответ 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