2009-11-12 4 views
116

У меня есть переменная JavaScript, которая содержит имя функции JavaScript. Эта функция существует на странице, загрузившись и помещенной с использованием $ .ajax и т. Д.Вызов функции JavaScript, названной в переменной

Может ли кто-нибудь сказать мне, как бы я назвал функцию javascript, названную в переменной, пожалуйста?

Имя функции находится в переменной, поскольку URL-адрес, используемый для загрузки фрагмента страницы (который вставлен на текущую страницу), содержит имя вызываемой функции.

Я открыт для других предложений о том, как реализовать это решение.

+7

Это вопрос примерно 18 раз раньше, чем SO. * Пожалуйста * Поиск. –

+0

звучит скорее как обратный вызов ... не так ли? – Perpetualcoder

+2

@Crescent Fresh, FWIW, я не вижу ничего в соответствующей боковой панели, которая выглядит актуальной. –

ответ

215

Я бы избежал оценки.

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

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

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

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

window["functionName"](); 

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

myNameSpace["functionName"](); 

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

+0

Это хорошая идея –

+3

... и если вы собираетесь делать что-то подобное, вероятно, вы должны определить, что ваши функции определены как члены объекта. – Quentin

+1

Согласен, 'eval()' следует избегать в этом случае, чтобы избежать проблем с XSS. – pkaeding

4

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

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

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

eval(variable + '();'); 

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

+0

это было хорошо и решило мою проблему, но хорошо ли использовать eval? – nirmal

+1

Почему это не безопасно? Eval - это зло, только когда вы передаете ему пользовательский ввод. Подобно тому, как серверная сторона eval func принимает данные клиента как аргумент – avalanche1

50

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

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

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

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

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

+0

Я вижу, мы думаем одинаково. :-) – Nosredna

+0

Да, поддержал ваш ответ со всей справедливостью, когда вы избивали меня;) – anddoutoi

+20

Упрощенный, потому что я чертовски хороший парень. – Nosredna

19

Определенно избегайте использования 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 объекта, но он не будет выполнять любой код.

+0

Спасибо. Хотя, возможно, не совсем то, что нужно пользователю, это именно то, что мне нужно. Я забыл свой() при вызове моей функции. – cepatt

+0

Лучшее приложение для узлов! Благодаря! – THpubs

Смежные вопросы