Цепочка функций с именами функций из списка [duplicate]

  if (substr ($ str, -1, 1) == ',') {$ str = substr ($ str, 0, -1);  }  

http://php.net/manual/en/function.substr.php

36
задан pars 21 November 2011 в 03:50
поделиться

7 ответов

вы ищете global

Обратите внимание, однако, что в модулях ничто никогда не подвергается этому уровню

10
ответ дан Mark Kahn 15 August 2018 в 18:09
поделиться
  • 1
    это, похоже, не работает для меня. Это также работает для «вызывающих функций»? – pars 21 November 2011 в 04:34
  • 2
    global[ 'functionName' ]( ... ) будет работать, если функция находится на глобальном уровне. Но, как я уже сказал, модули не выставляют ничего на этот уровень, все они завернуты в анонимную область. – Mark Kahn 21 November 2011 в 04:50

Если вам нужно это в области модуля, вы можете использовать что-то вроде этого

var module = require('moduleName');

module['functionName'](arguments);
2
ответ дан Artur Mirończuk 15 August 2018 в 18:09
поделиться

Я использую это для узла, см., работает ли этот подход для вас

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);
});
0
ответ дан balyanrobin 15 August 2018 в 18:09
поделиться

1) Если методы находятся в одном файле js

, определите все методы как свойства обработчика:

var Handler={};

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

Теперь назовите его следующим образом:

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

Выход: коды jerry


2) Если вы хотите сохранить методы в другом js-файле

//    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')

Выход: коды jerry

2
ответ дан JerryGoyal 15 August 2018 в 18:09
поделиться

Это не относится к объекту окна. В 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

-1
ответ дан pradeek 15 August 2018 в 18:09
поделиться
  • 1
    Да, в самом деле. Однако я ищу способ вызова функций по названию. – pars 21 November 2011 в 04:34

Если вам нужна такая возможность внутри модуля, один взлом - это хранить такие функции модуля в переменных внутри модуля, а затем вызывать их путем доступа к ним из свойств объекта модуля. Пример:

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]();

Я изучаю веревки с самим узлом, выше вероятно, всевозможные ошибки :-). Возможно, более лучший способ написать этот пример будет (для модуля 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!

93
ответ дан ravi 15 August 2018 в 18:09
поделиться
  • 1
    Это более устойчивый, поддерживаемый и нормализованный подход OO для JS. Спасибо. – Marc 3 June 2015 в 03:31
  • 2
    Спасибо, мне пришлось использовать что-то вроде этого в некотором сложном для абстрактного кода сегодня. – Jim Factor 20 September 2017 в 21:09
0
ответ дан Conor Reid 29 October 2018 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: