Вызов функции JavaScript с именем в переменной [duplicate]

$f = (float) "1.8281e-009";
var_dump($f); // float(1.8281E-9)
140
задан meagar 9 October 2012 в 05:42
поделиться

4 ответа

Я бы избегал eval.

Чтобы решить эту проблему, вы должны знать следующее о JavaScript.

  1. Функции - это объекты первого класса, поэтому они могут быть свойствами объекта (в этом случае они вызываются методы ) или даже элементы массивов.
  2. Если вы не выбираете объект, которому принадлежит функция, он принадлежит глобальной области. В браузере это означает, что вы вешаете его на объект с именем "window", в котором живут глобальные объекты.
  3. Массивы и объекты тесно связаны. (Ходят слухи, что они могут быть даже результатом инцеста!) Вы можете часто использовать вместо квадратных скобок [] точки , или наоборот.

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

Итак, почему бы не что-то вроде,

window["functionName"]();

Это ' s при условии, что ваша функция живет в глобальном пространстве. Если вы используете пространство имен, то:

myNameSpace["functionName"]();

Избегайте eval и избегайте передачи строки в setTimeout и setInterval. Я пишу много JS, и мне НИКОГДА не нужен eval. "Необходимость" в eval возникает из-за недостаточного знания языка. Вам нужно узнать об области видимости, контексте и синтаксисе. Если вы когда-нибудь застряли с оценкой, просто спросите - вы быстро научитесь.

253
ответ дан 23 November 2019 в 22:41
поделиться

Если он находится в глобальной области видимости, лучше использовать:

function foo()
{
    alert('foo');
}

var a = 'foo';
window[a]();

, чем eval () . Потому что eval () - это evaaaaaal .

Точно так, как сказал Носредна за 40 секунд до меня, то есть>. <

62
ответ дан 23 November 2019 в 22:41
поделиться

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

eval('var myfunc = ' + variable);  myfunc(args, ...);

Если вам не нужно передавать аргументы, это может быть проще.

eval(variable + '();');

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

5
ответ дан 23 November 2019 в 22:41
поделиться

Определенно избегайте использования eval для подобных действий, иначе вы откроетесь для уязвимостей XSS (межсайтовый скриптинг).

Например, если бы вы были чтобы использовать предлагаемые здесь решения eval , гнусный пользователь мог отправить своей жертве ссылку, которая выглядела бы так:

http://yoursite.com/foo.html?func=function () {alert ('Im% 20In% 20Teh% 20Codez');}

И их javascript, а не ваш, будет выполнен. Конечно, этот код может сделать что-то гораздо худшее, чем просто всплывающее уведомление; он может украсть куки, посылать запросы в ваше приложение и т. д.

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

// 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 , но не будет выполнять никакого кода.

23
ответ дан 23 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: