Подтвердить что ты не робот

Javascript: передать функцию как параметр другой функции, код вызывается в другом порядке, тогда я ожидаю

Я хочу передать функцию другой функции в качестве параметра.

Я хочу сделать это, потому что последняя функция вызывает метод async JQuery и AFTER, который возвращает результат, я хочу, чтобы какой-то код javascript выполнялся.

И поскольку эта функция вызывается из нескольких мест, я хочу, чтобы код выполнялся (после запуска кода async 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;
}

Теперь то, что я хотел достичь (или, по крайней мере, то, что, как я думал, произойдет), это то, что alert4 будет срабатывать, тогда loadhtml будет запускать alert1, alert2 и alert3, а затем код вернется в alert5.

Но происходит следующее: alert1, alert2, alert3, alert4, alert5.

Кто-нибудь знает, что я делаю неправильно, и почему это порядок, в котором выполняется код?

Похоже, что alert1..alert3 выполняется, когда я определяю new function(), но почему он НЕ ТАКЖЕ выполняется, когда я вызываю его из функции LoadHtml?

4b9b3361

Ответ 1

$('#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
}

Две ошибки: синтаксис для анонимных функций не включает ключевое слово new; и JavaScript требует скобок для вызовов функций, даже если функции не принимают никаких аргументов. Когда вы просто говорите funcToExecute, это просто переменная, дающая ее значение в контексте, где ничто не использует это значение (вроде записи 3; в качестве инструкции).

Вы могли заметить, что уже знаете, как использовать анонимные функции: вы не пишете $('#AddThirdParty').click(new function() ...);

Ответ 2

$('#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;
}

Ключевое слово new создает объект из функции. Это означает, что функция (анонимная) получает вызов немедленно. Это будет то же самое, что

var foo = function() {
    alert("1");
    alert("2");
    alert("3");
}
var func = new foo();

Это означает, что вы создаете новый объект (а не функцию!) и внутри конструктора ваше предупреждение 1,2,3. Затем вы предупреждаете 4. Затем вы вызываете LoadHtml, который ничего не делает, затем вы предупреждаете 5.

Что касается

funcToExecute;

Функция funcToExecute - это просто переменная, содержащая функцию. Это действительно нужно выполнить.