Динамическое именование и реализация тела функции JavaScript - PullRequest
4 голосов
/ 29 июля 2010

Для простоты я включил скрипт, который динамически вызывает функцию по имени:

var foo = "hello";
var bar = "world";
var function_name = "say_" + foo + bar;

// Since its name is being dynamically generated, always ensure your function actually exists
if (typeof(window[function_name]) === "function")
{
    window[function_name](" World!");
}
else
{
    throw("Error.  Function " + function_name + " does not exist.");
}

function say_helloworld(the_word)
{
    alert("Hello " + the_word);
}

Но код функции say_helloworld написан статически. Я хотел бы что-то вроде:

var function_implementation = 'function say_'+foo+bar+
    '(the_world){alert("Hello " + the_world);}';
eval(function_implementation);

но без использования eval (). Есть еще более уродливый подход: сделать AJAX-вызов для получения функции.

Можете ли вы увидеть лучший подход?

Ответы [ 3 ]

5 голосов
/ 29 июля 2010

Вы можете использовать встроенное выражение функции:

window['say_'+foo+bar]= function(the_world) {
    alert('Hello '+the_world);
};

Однако практически никогда нет веских причин использовать переменные с динамическим именем.Вместо этого сохраните функции в отдельном объекте поиска:

var says= {
    helloworld: function(the_world) {
        alert('Hello '+the_world);
    },
    somethingelse: function(otherthing) {
        alert('Something else with '+otherthing);
    }
};
says[somevar]('potatoes');
1 голос
/ 29 июля 2010

Вы можете использовать тайм-аут, который будет интерпретировать ваш код, но это может быть внутреннее использование eval, поэтому не уверен, что вы хотите этого.

fText = 'function test(a){alert(a);}';
setTimeout(fText,0);

но вам нужно подождать несколько миллисекунд, прежде чем вызывать его ..

1 голос
/ 29 июля 2010

Если вы хотите динамически генерировать свою функцию без eval, вы можете использовать конструктор

Function([arg1[, arg2[, ... argN]],] functionBody)

Таким образом, вы можете делать такие вещи, как

var func = new Function('message', 'alert("Hello, " + message);')
func('world!');

Подробнее см. MDC .

Приветствия

Примечание : я никогда раньше не использовал этот подход и никогда раньше не использовал конструктор Function (). Так что я не знаю, может ли это иметь какие-то другие недостатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...