2009-09-30 40 views
5

Bu json'um var ve bu jsonu aldığımda geri arama nesnesine gelen işlevi çalıştırmam gerekiyor. Bir nesnede yapılan değerlendirmede parametreler nasıl iletilir?

{ 
    formId: 'snn_service_item_form', 
    item_id: '1', 
    item_title: 'some item', 
    item_description: '', 
    item_duration: '10', 
    item_price: '120', 
    item_level_1 : 1, 
    item_level_2 : 0, 
    item_level_3 : 1, 
    item_type: 'p', 
    callback : { 
     callbackName : 'getServices', 
     callbackParams : { 
      _param1 : 1, 
      _param2 : 2 
    } 
} 
} 

yüzden buna göre ben bu çalıştırmanız gerekir:

getServices(1,2); 

i yapabileceği eval işlevi gibi olan:

eval(json.callback.callbackName+'(\''+ json.callback.callbackNParams._param1 +'\',\''+ json.callback.callbackNParams._param2 +'\')'); 

i için içine koyarak bunu otomatik hale getirebilirsiniz bir dizeye parametreler girme ve yazma, ama bu gitmek için en iyi yol olduğunu düşünmüyorum.

bir var itibaren işlev adı atamak için bir yol yoktur ve benzeri benim durumumda, bir nesne olarak parametrelerini veren i bunu yapmak için bir yol değildir biliyorum

json.callback.callbackName(json.callback.callbackParams); 

ama ne olduğunu ben öğrenmek istemek.

Teşekkürler, Sinan.

+0

Yanıtlar için teşekkürler, ben çağrı üzerinde çalışacağım ve o koşmak için uygulayın. – Sinan

cevap

10

Çağrılacak işlevin nerede tanımlandığına bağlıdır (genel kapsam veya yerel kapsam). Küresel Eğer

, sadece küresel window nesnesi aracılığıyla işlev başvurusu sen eval gerekmez (ve bunu önlemek için daha güvenli):

var args = []; 
for(var p in json.callback.callbackParams) { 
    args.push(json.callback.callbackParams[p]); 
} 
window[json.callback.callbackName].apply(null, args) 

apply() function yukarıda kullanılan bakınız.

Eğer yerel bir kapsamda ise, o zaman eval'a ihtiyacınız var (nasıl hazırsınız).

+0

Yerel bir kapsam için, işlev nesnesini almak için "eval" işlevini kullanabilir ve daha sonra bunu çağırmak için daha güvenilir olan "apply" işlevini kullanabilirsiniz. BTW 'nin' (in) 'için paramları istediğiniz sırayla döndüreceği garanti edilmez. – bobince

1

Eval kullanmayın. Sen window nesneden adlandırılmış küresel değişken veya işleve bir başvuru alabilirsiniz:

var callbackfunction= window[json.callback.callbackName]; 

Ve sadece onları güvenilmez JavaScript geri çözümlenen için bir dizeye değerlerinizi tefrika çalışıyor aptalca. Açıkça işlevini çağırın:

callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2); 

(. Burada window nesne yöntemleri kullanmadığınız zaman için this için bir kukla değerdir) parametrelerin herhangi sayıda çevirmek olacağını kabul etmek bunu otomatik hale getirmek için daha iyi

sonra

callbackParams: [1, 2] 

ve işlevi çağırmak için apply kullanın:

düz Array içine callbackParams
+2

'func.call (null, ...)' 'func.call (window, ...)' ile aynı (iyi, neredeyse) davranışı verir - 'this' değeri global nesne olan işlevi çağırır. Yeni başlayanlar için muhtemelen daha az açıklayıcı olsa da, daha kısadır. – kangax

İlgili konular