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

June 10th, 2008 | Categories: Development | Tags:

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

1
var funcName = 'someFunc';

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// собираем нужные функции в массиве
var actions = {

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

    goodFunc: function(params) {
        ...
    }

};

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

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

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

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

  1. Alexander
    June 11th, 2008 at 11:50
    Quote | #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. June 11th, 2008 at 14:32
    Quote | #2

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

  3. geletka
    February 8th, 2010 at 14:42
    Quote | #3

    а еще проще так:

    var funcName=’myfunction’;
    self[funcName](список аргументов);

    self может быть parent и прочее, зависит от уровня функции

Comments are closed.