javascript:将函数作为参数传递给另一个函数,代码以另一个顺序调用然后我期望

Mic*_*hel 19 javascript jquery

我想将一个函数作为参数传递给另一个函数.

我想这样做,因为后一个函数调用异步Jquery方法和AFTER返回结果,我想要执行一些javascript代码.

并且因为从多个地方调用此函数,我希望代码在函数中传递(在执行异步Jquery代码之后).说得通?我希望 :)

现在看到的是代码执行的顺序不是我想要的.我已将代码简化为此代码:

$('#AddThirdParty').click(function() {
    var func = new function() {
        alert('1');
        alert('2');
        alert('3');
    }
    alert('4');
    LoadHtml(func);
    alert('5');
});
function LoadHtml(funcToExecute) {
    //load some async content
    funcToExecute;
}
Run Code Online (Sandbox Code Playgroud)

现在我想要实现的(或者至少我认为会发生的事情)是alert4会触发,然后loadhtml将触发alert1,alert2和alert3,然后代码将返回alert5.

但是会发生什么:alert1,alert2,alert3,alert4,alert5.

有谁知道我做错了什么以及为什么这是执行代码的顺序?

看起来我在定义时会执行alert1..alert3 new function(),但是当我从LoadHtml函数中调用它时,它为什么不执行呢?

Ama*_*dan 34

$('#AddThirdParty').click(function() {
    var func = function() { // NOTE: no "new"
        alert('1');
        alert('2');
        alert('3');
    }
    alert('4');
    LoadHtml(func);
    alert('5');
});
function LoadHtml(funcToExecute) {
    //load some async content
    funcToExecute(); // NOTE: parentheses
}
Run Code Online (Sandbox Code Playgroud)

两个错误:匿名函数的语法不包含关键字new; 即使函数不带任何参数,JavaScript也需要括号来进行函数调用.当你刚才说funcToExecute,这只是一个变量,在没有使用该值的上下文中给出它的值(有点像写作3;语句).

您可能会注意到您已经知道如何使用匿名函数:您没有写 $('#AddThirdParty').click(new function() ...);

  • 这很棒,但是如果他想在 func 中包含参数怎么办? (2认同)

Ray*_*nos 6

$('#AddThirdParty').click(function() {
    var func = new function() {
        alert('1');
        alert('2');
        alert('3');
    }
    alert('4');
    LoadHtml(func);
    alert('5');
});
function LoadHtml(funcToExecute) {
    //load some async content
    funcToExecute;
}
Run Code Online (Sandbox Code Playgroud)

new关键字创建从该函数的对象.这意味着函数(匿名)立即被调用.这将是相同的

var foo = function() {
    alert("1");
    alert("2");
    alert("3");
}
var func = new foo();
Run Code Online (Sandbox Code Playgroud)

这意味着您创建一个新对象(不是函数!)并在构造函数内部创建警报1,2,3.然后你提醒4.然后你调用LoadHtml什么都不做,然后你警告5.

至于

funcToExecute;

funcToExecute只是一个包含函数的变量.它实际上需要执行.