Имя функции Javascript как строка в функции самоиспускания

Я запускаю функцию self execute в javascript, чтобы не мешать никаким глобальным переменным на странице. У меня есть строка с именем функции, которую я хочу вызвать. Функция объявляется внутри моей функции самоисполнения. Есть ли способ вызвать эту функцию с помощью строки?

(function(document, window){
    var functionName = "myFunction";

    window[functionName](); //This does not work...        

    function myFunction(){
        //Do some stuff
    }

}(document, window)

Я нашел это: Как выполнить функцию JavaScript, когда у меня есть его имя в виде строки

но моя функция выполняется самостоятельно без имени, поэтому я не могу ссылаться на нее с помощью переменной окна.

Ответ 1

Без глобального загрязнения и избегает нестрогого метода arguments.callee.

На основе этого ответа.

// This Immediately Invoked Function Expression is invoked via `call`.
// call() takes 1 or more arguments: the first being the scope you want the 
// invoked function be in; the other arguments become arguments of the function
// itself.
// In this case, the scope of our function is an empty object ({}).
// This object allows us to attach functions using the this.* syntax and call the 
// functions with this["string"]() without ever polluting the global namespace. 
// It is also forward compatible with ECMAScript 5 scrict-mode as it does not
// use arguments.callee.
(function(document, window){
    var functionName = "myFunction";

    // you'll need to define the function _before_ you call it.
    this.myFunction = function(){
        //Do some stuff
        alert('me');
    };


    this[functionName]();

}.call({}, document, window));

Ответ 2

Это просто более чистая версия того, что предложили другие, глобальное загрязнение, отсутствие eval и отсутствие скрытых ссылок на переменные (arguments.callee и "this").

// Not sure why you were passing in doc and window, so I took it out for clarity
(function(){
    var funcs = {
      funcA: function () { return "a"},
      funcB: function () { return "b"}
    };

    var functionName = "funcA";
    funcs[functionName]();  
}();

Этот подход требует, чтобы вы объявили функции перед их использованием.

Ответ 3

Вы можете использовать eval(functionName + "()"), так как любая функция window также является глобальной функцией.

Ответ 4

Вы можете просто сохранить функцию myFunction где-нибудь (например, на this новый объект)?

См. Пример jsFiddle:

(function (document, window){
    var functionName = "myFunction",
        myFunctions = {
            myFunction: function() { alert('myFunction'); }
        };

    myFunctions[functionName]();
}(document, window));

Ответ 5

Если вы не возражаете определить функцию перед ее вызовом, вы можете использовать arguments.callee. Это позволяет избежать eval.

(function (){
  arguments.callee.f = function() {
    console.log('test');
  };
  arguments.callee['f']();
})();

Ответ 6

Вы правы. Это связано с тем, что ваша функция определена внутри вашей функции самоисполнения. Окно не знает внутреннего закрытия. Лучшее, что вы могли бы сделать, вероятно, eval:

a la:

eval(functionName + "();");

и, вероятно, не все это зло в этом случае: Когда JavaScript eval() не злой?

Ответ 7

Try: functionName.apply(context, arguments) или functionName.call(context[, argument 1, argument 2,...]) (посмотреть ссылку)

Или (в качестве плаката ниже) вы можете добавить функцию к объекту в пространстве имен окна:

var newObj = {}; newObj.myFunction = function() {//stuff}

newObj.myFunction();//вызывает новую функцию

Ответ 8

Думаю, я не могу прокомментировать ответы, поэтому я должен опубликовать его таким образом. Eval слишком опасен для меня, так как фактическое имя функции задается пользователем в строке.