Вызов JavaScript-функции по ее названию

Иногда в JavaScript’е бывает необходимо выполнить функцию зная только ее название, и это название содержится в строке, например вот так:

var funcName = 'someFunc';

Перед мной стояла такая задача: в AIR-приложении нужно было выполнять функции, названия которых приходят с AJAX-ответом. Sandbox AIR’а в следствии ограничений безопасности не позволяет выполнять функции при помощи eval’а. Так что, ограничения стояли такие: не использовать функции eval() и setTimeout()/setInterval().

Немного по-google-в я нашел множество вопросов о том как это сделать, но к сожалению без ответов. И решение не заставило себя долго ждать. Итак, идея моя была в следующем: все функции, которые предполагается вызывать таким образом, нужно собрать в одном массиве (объекте), и вызывать их обращаясь к ним как к элементам ассоциативного массива. Вот такое решение получилось в итоге:

// собираем нужные функции в массиве
var actions = {

    someFunc: function(params) {
        ...
    },

    goodFunc: function(params) {
        ...
    }

};

// это название функции допустим переданное в ответе на AJAX-запрос
var funcName = 'someFunc';

// а это параметры функции переданные все в том же ответе
var funcParams = {title: "Test Title", content: "Test Content"}

// вызываем функцию
actions[funcName](funcParams);

Если кто-то ищет решение этой задачи, то надеюсь мой небольшой хинт вам в этом поможет!

2 Responses to “Вызов JavaScript-функции по ее названию”

  1. Или можно так:

    function multiple(x, y){
    return x*y;
    }
    // new Function(, );
    var f = new Function(”x, y”, “return multiple(x, y);”);
    alert(f(3, 7));
    // или так
    alert(new Function(”x, y”, “return multiple(x, y);”)(8, 6));

  2. Так нельзя! Sandbox также запрешает создание функции.

Leave a Reply

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word