将函数作为Javascript

时间:2016-03-14 03:08:37

标签: javascript jquery function callback undefined

是否可以传递一个尚不存在的回调函数?我的目标是有一个共同的函数,它将等待另一个回调函数存在,当它存在时,它应该执行它。这是我到目前为止所做的,但是我无法弄清楚如何传递这个功能,因为它还没有作为一个函数存在。

function RunTemplateFunction(callback, userInfo) {
if ($.isFunction(callback)) {
    callback(userInfo);
} else {
    var myInterval = setInterval(function () {
        if ($.isFunction(callback)) {
            clearInterval(myInterval);
            callback(userInfo);
        }
    }, 200);
}
}

我运行这样的功能:

RunTemplateFunction(MyFunctionToRun, GetUserInfo());

由于显而易见的原因,我得到MyFunctionToRun未定义,我还尝试了将函数作为字符串传递,然后使用eval()将字符串转换为函数的解决方法。但是这会引发同样的错误。我还想过使用new function(),但实际上创建了一个新函数。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

如果您通过RunTemplateFunction致电undefined我们无法看到,是否定义了回调,因为我们没有提及任何内容。

如果您可以修改声明以接受object,如下所示,我们可以实现我们想要的目标

function RunTemplateFunction(options, userInfo) {
    if ($.isFunction(options.callback)) {
        console.log('called1',userInfo);
        options.callback(userInfo);
    } else {
        var myInterval = setInterval(function () {
            if ($.isFunction(options.callback)) {
                console.log('Called dynamically!!');
                clearInterval(myInterval);
                options.callback(userInfo);
            }
        }, 200);
    }
}
var options = {}
RunTemplateFunction(options,{user:122});

options.callback = function(){
 console.log("I'm called!!");
}

这将打印

Called dynamically!!
I'm called!!

修改

我们也可以在没有callback的情况下以下列方式调用setInterval函数,它看起来会有所不同,但options.callback变量会被template.callMe函数替换,并且它也会瞬间变换。

function TemplateRunner(userInfo){
  this.callMe = function(cb){
    this.templateFunction(cb);
  }
  this.templateFunction = function(callback){
   callback(userInfo);
  }
}
var template = new TemplateRunner({user:100})
template.callMe(function(user){
  console.log('call me1',user);
});
template.callMe(function(user){
  console.log('call me2',user);
})

这将打印

call me1 {user: 100}
call me2 {user: 100}