Вызов функции 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 + '();');

Применяется стандартное предупреждение о сухом коде.