【问题标题】:Equivalent of "window["functionName"](arguments)" in server-side相当于服务器端的“window[”functionName”](arguments)”
【发布时间】:2011-11-21 01:50:45
【问题描述】:

window["functionName"](arguments) 在 NodeJS 服务端的等效代码是什么?

【问题讨论】:

  • @infact 你能说出你在找什么吗?

标签: javascript node.js


【解决方案1】:

如果您需要模块中的此类功能,一种技巧是将此类模块函数存储在模块中的变量中,然后通过从模块对象属性中访问它们来调用它们。示例:

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!

【讨论】:

  • 这是一种更加可持续、可维护和规范化的 JS OO 方法。谢谢。
  • 谢谢我今天不得不在一些难以抽象的代码中使用这样的东西。
  • 太好了,我只需要 x[funcstr]();因为该方法是由其他插件添加的。
【解决方案2】:

您正在寻找global

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

【讨论】:

  • 这似乎对我不起作用。它也适用于“调用函数”吗?
  • global[ 'functionName' ]( ... ) 将在函数处于全局级别时起作用。但正如我所说,模块不会向该级别公开任何内容,它们都包装在匿名范围内。
  • @MarkKahn,怎么称呼他们?
【解决方案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)
    }
}

different.js中使用Handler.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】:

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

          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

            【讨论】:

            • 确实如此。但是,我正在寻找一种专门按名称调用函数的方法。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-28
            • 1970-01-01
            • 2019-04-27
            • 2015-02-08
            • 2011-09-18
            • 2023-03-13
            • 1970-01-01
            相关资源
            最近更新 更多