Вызов функции JavaScript, названной в переменной
У меня есть переменная JavaScript, которая содержит имя функции JavaScript. Эта функция существует на странице, загрузившись и помещая ее с помощью $.ajax и т.д.
Может ли кто-нибудь сказать мне, как бы я назвал функцию javascript, названную в переменной, пожалуйста?
Имя функции находится в переменной, поскольку URL-адрес, используемый для загрузки фрагмента страницы (который вставлен на текущую страницу), содержит имя вызываемой функции.
Я открыт для других предложений о том, как реализовать это решение.
Ответы
Ответ 1
Я бы избежал eval.
Чтобы решить эту проблему, вы должны знать эти вещи о JavaScript.
- Функции являются первоклассными объектами, поэтому они могут быть свойствами объекта (в этом случае они называются методами) или даже элементами массивов.
- Если вы не выбираете объект, к которому принадлежит функция, он относится к глобальной области. В браузере это означает, что вы навешиваете его на объект с именем "окно", в котором живут глобальные пользователи.
- Массивы и объекты тесно связаны между собой. (Ходят слухи, что они могут даже быть результатом кровосмешения!) Вы можете часто заменять с помощью точки
.
, а не квадратных скобок []
, или наоборот.
Ваша проблема возникает из-за рассмотрения точечного способа ссылки, а не квадратного скобки.
Итак, почему бы не что-то вроде
window["functionName"]();
Предположим, что ваша функция живет в глобальном пространстве. Если у вас есть имена, то:
myNameSpace["functionName"]();
Избегайте eval и избегайте передачи строки в setTimeout и setInterval. Я пишу много JS, и мне НИКОГДА не нужно eval. "Необходимость" eval исходит из незнания языка достаточно глубоко. Вам нужно узнать о области охвата, контексте и синтаксисе. Если вы когда-либо застряли с eval, просто спросите - вы скоро научитесь.
Ответ 2
Если это глобальная область действия, лучше использовать:
function foo()
{
alert('foo');
}
var a = 'foo';
window[a]();
чем eval()
. Потому что eval()
evaaaaaal.
Точно так же, как Носредна сказал за 40 секунд до меня, что есть > . <
Ответ 3
Определенно избегайте использования eval
, чтобы сделать что-то вроде этого, или вы откроете себя для уязвимостей XSS (Cross-Site Scripting).
Например, если бы вы использовали предлагаемые здесь решения eval
, нечестивый пользователь мог бы отправить ссылку на свою жертву, которая выглядела бы так:
http://yoursite.com/foo.html?func=function() {alert ('Im %20In %20Teh %20Codez');}
И их javascript, а не ваш, будут выполнены. Этот код мог бы сделать что-то гораздо хуже, чем просто всплывающее предупреждение; он может украсть файлы cookie, отправить запросы в ваше приложение и т.д.
Итак, убедитесь, что вы никогда не eval
ненадежный код, который поступает с пользовательского ввода (и что-либо на идентификаторе строки запроса, рассматриваемом пользователем). Вы можете ввести пользовательский ввод в качестве ключа, который будет указывать на вашу функцию, но убедитесь, что вы ничего не выполняете, если указанная строка не соответствует ключу вашего объекта. Например:
// set up the possible functions:
var myFuncs = {
func1: function () { alert('Function 1'); },
func2: function () { alert('Function 2'); },
func3: function () { alert('Function 3'); },
func4: function () { alert('Function 4'); },
func5: function () { alert('Function 5'); }
};
// execute the one specified in the 'funcToRun' variable:
myFuncs[funcToRun]();
Это не удастся, если переменная funcToRun
не указывает на что-либо в объекте myFuncs
, но не будет выполнять никакого кода.
Ответ 4
Это отвратительно, но это первое, что появилось в моей голове. Это также должно позволить вам передать аргументы:
eval('var myfunc = ' + variable); myfunc(args, ...);
Если вам не нужно передавать аргументы, это может быть проще.
eval(variable + '();');
Применяется стандартное предупреждение о сухом коде.