2011-04-08 16 views
9

Böyle bir fonksiyon yazmak istiyorum:CallBack işlevini kabul eden bir işlevi nasıl yazabilirim ve 'güvenli' bir şekilde çalıştırabilir miyim?

function doGoodJob(someId, callBackfunction){ 

// some stuff with someId 

// todo: RUN callBackFunction here 

} 

Derlemenin kod enjeksiyonu açısından “tehlikeli” olduğunu söylüyorlar.

, geri arama işlevini kabul eden ve güvenli bir şekilde çalıştıran bir JavaScript işlevi yazmak için en iyi uygulama hangisidir?

cevap

23

geri arama bir dize ya da gerçek işlevi var mı?

Eğer onun bir fonksiyonu ..

function doGoodJob(someId,callbackFunction) 
{ 
    callbackFunction(); 
} 

doGoodJob(1,function(){alert('callback');}); 

Eğer onun bir dize sen Function kurucu kullanabilirsiniz. her ikisi için

function doGoodJob(someId,callbackFunction) 
{ 
    var func = new Function(callbackFunction) 
    func(); 
} 
doGoodJob(1,"alert('test');"); 

Veya testi ..

function doGoodJob(someId,callbackFunction) 
{ 
    var func = (typeof callbackFunction == 'function') ? 
     callbackFunction : new Function(callbackFunction); 

    func(); 
} 

doGoodJob(1,function(){alert('callback');}); 
doGoodJob(1,"alert('test');"); 
2

Bu çalışması gerekir:

function doGoodJob(simeOd, callBackFunction){ 
    /** Do stuff **/ 
    callBackFunction(); 
} 

hızlı keman: http://jsfiddle.net/pS67X/

2

geç bu konuya olsa sadece bazı şey adde istedi. Yukarıdaki çözüm, bağımsız değişken olarak uyarı veya geçiş işlevi için çalışır, ancak aşağıdaki durumda değildir.

doGoodJob(1, "someCallbackFunction"); 
function someCallBackFunction() { 
    alert("im called"); 
} 

yerine eğer gibi kullanımı Eval (callbackFunction) altında

function doGoodJob(someId,callbackFunction) { 
    var func = (typeof callbackFunction == 'function') ? 
    callbackFunction : eval(callbackFunction); 

    func(); 
} 
doGoodJob(1,someCallBackFunction); 
doGoodJob(1,"someCallBackFunction");