Как я могу написать функцию, принимающую функцию callBack, и запустить ее «безопасным» способом? - PullRequest
10 голосов
/ 08 апреля 2011

Я хочу написать такую ​​функцию:

function doGoodJob(someId, callBackfunction){

// some stuff with someId

// todo: RUN callBackFunction here

}

Они говорят, что eval «опасен» с точки зрения внедрения кода.

, так что, как лучше писать JavaScriptфункция, которая принимает функцию обратного вызова и безопасно ее запускает?

Ответы [ 4 ]

24 голосов
/ 08 апреля 2011

Является ли ваш обратный вызов строкой или реальной функцией?

Если это функция ..

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

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

Если это строка, вы можете использовать конструктор Функция .

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');");
2 голосов
/ 13 ноября 2013

хоть и опоздал на эту тему, просто хотел кое-что добавить.Приведенное выше решение работает для предупреждения или передачи функции в качестве аргумента, но не в приведенном ниже случае.

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");
2 голосов
/ 08 апреля 2011

Это должно работать:

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

Быстрая скрипка: http://jsfiddle.net/pS67X/

0 голосов
/ 30 апреля 2018

Функция обратного вызова означает передачу функции в качестве аргумента, как мы передаем переменную.
При вызове функции обратного вызова мы можем использовать ее, как показано ниже:

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