如何编写一个接受回调函数的函数并在“安全”的环境中运行它?方式?

发布于 2024-10-31 11:06:17 字数 238 浏览 7 评论 0原文

我想写一个这样的函数:

function doGoodJob(someId, callBackfunction){

// some stuff with someId

// todo: RUN callBackFunction here

}

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

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

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

惯饮孤独 2024-11-07 11:06:17

您的回调是字符串还是实际函数?

如果它是一个函数。

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');");

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');");
手长情犹 2024-11-07 11:06:17

这应该有效:

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

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

This should work:

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

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

幸福丶如此 2024-11-07 11:06:17

虽然这个话题已经晚了,但我只是想补充一些东西。
上述解决方案适用于警报或将函数作为参数传递,但不适用于以下情况。

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");

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");
小苏打饼 2024-11-07 11:06:17

回调函数意味着函数作为参数传递,就像我们传递变量一样。

当调用回调函数时,我们可以像下面这样使用它:

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

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文