如何编写接受callBack函数并以“安全”方式运行的函数?

时间:2011-04-08 11:44:06

标签: javascript callback eval code-injection

我想写这样一个函数:

function doGoodJob(someId, callBackfunction){

// some stuff with someId

// todo: RUN callBackFunction here

}

他们说eval在代码注入方面是“危险的”。

那么,编写一个接受回调函数并安全运行它的JavaScript函数的最佳做法是什么?

4 个答案:

答案 0 :(得分:24)

您的回调是字符串还是实际功能?

如果它是一个功能..

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

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

如果是字符串,则可以使用Function构造函数。

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

或测试两者..

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

     func();   
}

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

答案 1 :(得分:2)

这应该有效:

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

快速小提琴:http://jsfiddle.net/pS67X/

答案 2 :(得分:2)

虽然这篇话题已经很晚了,但还是想加入一些东西。 上述解决方案适用于警报或传递函数作为参数,但不适用于以下情况。

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

相反,如果使用eval(callbackFunction),如下所示

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

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

答案 3 :(得分:0)

回调函数意味着函数传递作为参数,就像我们传递变量一样。
当调用回调函数时,我们可以像下面这样使用它:

<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>