pencilCake
pencilCake

Reputation: 53253

How can I write a function accepting callBack function and run it in a 'safe' way?

I want to write such a function:

function doGoodJob(someId, callBackfunction){

// some stuff with someId

// todo: RUN callBackFunction here

}

They say eval is 'dangerous' in terms of code injection.

so, what is the best practice to write a JavaScript function that accepts a call-back function and runs it securely?

Upvotes: 11

Views: 14284

Answers (4)

user3216114
user3216114

Reputation: 325

Callback function means function pass as an argument like we pass variable.
When calling the callback function, we could use it like below:

<script>
function callbackExample(arg1, callback){
    alert(arg1);
    var x = 10, y = 20;
    if (callback && typeof(callback) === "function") {
        callback(x+y);
    }
}
callbackExample("test", function(res){
    alert("This is the callback function..." + res);
});
</script>

Upvotes: 0

user2300875
user2300875

Reputation: 529

though late to this topic, just wanted to adde some thing. Above solution works for alert or passing function as argument, but not in the below case.

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

instead if use eval(callbackFunction) like below

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

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

Upvotes: 2

Richard Friend
Richard Friend

Reputation: 16018

Is your callback a string or an actual function ?

If its a function..

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

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

If its a string you can use the Function constructor.

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

Or test for both..

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

     func();   
}

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

Upvotes: 26

Thor Jacobsen
Thor Jacobsen

Reputation: 8851

This should work:

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

quick fiddle: http://jsfiddle.net/pS67X/

Upvotes: 2

Related Questions