2010-09-17 11 views
26

mam nadzieję, że to pytanie nie jest zbyt proste, ale nie mam pojęcia :(JavaScript - Zmienna w nazwie funkcji, możliwe?

Jak mogę uruchomić funkcję z var w nazwie funkcji?

Na przykład ...

Moje funkcje

function at_26(); 
function at_21(); 
function at_99(); 

uruchomić funkcję

var test_id = 21; 
at_'+test_id+'(); // doesn't work 

Mam nadzieję, że ktoś może mi pomóc.

Z góry dzięki! Peter

+5

Dlaczego trzeba, że? Możesz utworzyć funkcję o nazwie 'at()' i przekazać do niej swój numer jako argument. – jwueller

Odpowiedz

57

Przechowuj swoje funkcje w obiekcie, zamiast ustawiać je na najwyższym poziomie.

var at = { 
    at_26: function() { }, 
    at_21: function() { }, 
    at_99: function() { } 
}; 

Następnie można uzyskać do nich dostęp jak każdy inny obiekt:

at['at_' + test_id](); 

Można też do nich dostęp bezpośrednio z obiektu window ...

window['at_' + test_id](); 

... i uniknąć konieczności ich przechowywania w obiekt, ale oznacza to grę w globalnym zakresie, którego należy unikać.

+0

Niezły pomysł, dziękuję bardzo! – Peter

+5

Jestem bardziej ciekawy, dlaczego ktoś mógłby stworzyć 100 funkcji, które różnią się tylko indeksem ... – colithium

+3

Testy. Powiedzmy, że masz bibliotekę narzędzi, która robi coś w rodzaju transformacji ścieżek. Możesz mieć szereg ścieżek do testowania każdej metody. Jest to łatwy sposób dodawania narzędzi do biblioteki bez duplikowania kodu, aby uruchomić testy dla każdej nowej metody. – jonschlinkert

2

Możesz także spróbować

function at_26(){}; 
function at_21(){}; 
function at_99(){}; 

var test_id = 21; 
eval('at_'+test_id+'()'); 

jednak użyć tego kodu, jeśli masz bardzo silne powody pomocą eval. Używanie eval w javascript nie jest dobrą praktyką ze względu na jego wady, takie jak "niewłaściwe używanie go może otworzyć twój skrypt na ataki przy wtrysku".

+2

Nie! W tym przypadku nie używaj 'eval()'! Tutaj jest dużo lepszych rozwiązań! – jwueller

+1

@elusive: To prawda, lepsze rozwiązania zawsze będą używane. Właśnie podałem alternatywne rozwiązanie. Mam nadzieję, że nie masz nic przeciwko temu. – Nik

+2

Ponieważ nie wszyscy koniecznie znają zło 'eval()', powinieneś podać te informacje w swoim poście. Nikt nie powinien używać tego rozwiązania, chyba że ma bardzo dobry powód i dokładnie wie, co robi. 'eval()' ma swoje prawidłowe zastosowania, ale to nie jest jedna z nich. – jwueller

17

Byłeś blisko.

var test_id = 21 
this['at_'+test_id]() 

Jednak to, co może chcesz:

at = [] 
at[21] = function(){ xxx for 21 xxx } 
at[test_id]() 
+1

'this ['is_awesome']; // Dzięki. " – Giraldi

0

Istnieje lepszy sposób to obiekt window - który nie jest przyjazny w firefox - używaj „ja” zamiast - tak na przykład publikowane przez Quentin wygląda to tak:

self['at_' + test_id]();