【问题标题】:Function with function as parameter以函数为参数的函数
【发布时间】:2013-11-07 16:10:32
【问题描述】:

我正在尝试定义一个函数,该函数应该调用作为主函数参数传递的(另一个)函数。

function showMessage(title, text, button, callback) {

    console.log(title, text, button);

    if (typeof (callback) != "function") {
        function callback() {};
        alert("converted callback");
    }

    $("div").click( function() {
        callback();
    });

}

function myfunction() {
    alert("function!");
}

showMessage("title", "text", "button", myfunction() );

演示:http://jsfiddle.net/XvE8D/1/

问题是当showMessage()函数被调用时,myfunction()被立即调用。

我该如何解决这个问题?

【问题讨论】:

  • 它被立即调用,因为你正在调用它。 :) myfunction() <-- () 说跑!

标签: javascript jquery function


【解决方案1】:

如您所见,带括号的myfunction() 调用myfunction

尝试不带括号将myfunction 传递给showMessage

showMessage("title", "text", "button", myfunction);

另外,在showMessage 中,您必须更改这部分:

if (typeof (callback) != "function") {
    function callback() {};
    alert("converted callback");
}

到这里:

if (typeof (callback) != "function") {
    callback = function() {};
    alert("converted callback");
}

要将其他参数传递给myfunction,您可以将myfunction 包装在另一个函数中并将其传递给showMessage。像这样的东西应该可以工作:

showMessage("title", "text", "button", function() { myfunction('foo'); });

【讨论】:

  • 谢谢,但是如果我需要将参数传递给回调怎么办?我是否需要先将它们传递给 showMessage,然后再将它们传递给回调?
  • @FezVrasta 这取决于。回调的参数是在您调用 showMessage 时已知的,还是仅在用户单击元素时才知道?
  • 谢谢,我已经使用了@Arun P Johny 的答案中的 $.noop 以及您的其他答案。
【解决方案2】:

您需要将函数引用作为回调参数传递,在您的情况下,您正在调用函数并将myfunction(在这种情况下为未定义)返回的值分配为回调参数。

另见使用$.noop()

function showMessage(title, text, button, callback) {   
    console.log(title, text, button);

    callback = callback || $.noop;

    $("div").click(function(){
        callback('my params')
    });
}

function myfunction() {
    alert("function!");
}

showMessage("title", "text", "button", myfunction);

【讨论】:

  • 如果我需要将参数传递给myfunction怎么办?
  • 好的,所以我需要将函数的参数作为 showMessage 函数的单独参数传递对吗?
猜你喜欢
  • 2018-10-02
  • 2015-03-20
  • 2021-09-06
  • 2015-07-14
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多