2010-09-17 19 views
26

i fonksiyon adında bir var olan bir işlev başlayabilirsiniz Bunu nasıl soru çok basit değildir umut, ama hiçbir fikri :(Javascript - İşlev adında değişken, mümkün mü?

var? Örneğin

...

benim fonksiyonları

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

fonksiyonunu başlatmak

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

Umarım birileri bana yardım edebilir.

Şimdiden teşekkürler! Peter

+5

Neden böyle ihtiyacım var? 'At() 'adlı bir işlev oluşturabilir ve numaranızı bir argüman olarak iletebilirsiniz. – jwueller

cevap

57

İşlevlerinizi bir üst düzeye çıkarmak yerine bir nesnede saklayın. ... Ayrıca window nesneden doğrudan erişebilecek

at['at_' + test_id](); 

window['at_' + test_id](); 

... ve bunları saklamak zorunda kalmamak:

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

Sonra başka bir nesne gibi erişebilirsiniz Bir nesne, ama bu kaçınılması gereken küresel kapsamda oynamak anlamına gelir.

+0

Güzel fikir, çok teşekkür ederim! – Peter

+5

Birinin neden sadece bir endeksle farklılık gösteren 100 fonksiyon yarattığını merak ediyorum ... – colithium

+3

Testler. Dönüşüm yolları gibi bir şey yapan bir yardımcı program kitaplığınızın olduğunu varsayalım. Her yöntemi test etmek için bir dizi yolunuz olabilir. Bu, her yeni yönteme yönelik testleri çalıştırmak için kodu çoğaltmaksızın kütüphaneye yardımcı program eklemenin kolay bir yoludur. – jonschlinkert

2

Ayrıca

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

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

denemek Ama eval kullanımı için çok güçlü nedenleri varsa bu kodu kullanabilirsiniz. Javascript'teki değerlendirmenin kullanılması, "uygunsuz bir şekilde kullanmanız komut dosyanızı enjeksiyon saldırılarına açabilir" gibi dezavantajları nedeniyle iyi bir uygulama değildir.

+2

Hayır! Bu durumda 'eval()' kullanmayın! Burada daha iyi çözümler var! – jwueller

+1

@elusive: Doğru, her zaman daha iyi çözümler kullanılmalıdır. Alternatif bir çözüm buldum. Umarım buna aldırmazsın. – Nik

+2

Herkesin mutlaka "eval()' ın kötülüğünü bilmediğinden, bu bilgiyi yayınınıza vermelisiniz. Çok iyi bir nedeni olmadığı ve ne yaptığını bilmediği sürece, kimse bu çözümü kullanmamalıdır. eval() 'ın geçerli kullanımları vardır, ancak bu onlardan biri değildir. – jwueller

17

Çok yakındınız.

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

Ancak, size istediğinizin:

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

'bu ['is_awesome']; // Teşekkürler – Giraldi

0

daha iyi bir yolu daha sonra pencere nesnesi var - ateş değil dost - tarafından gönderildi örnekte bu yüzden - yerine "kendini" kullanın Quentin o şuna benzer:

self['at_' + test_id]();

İlgili konular