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
?
Ответы
Ответ 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 - это просто переменная, содержащая функцию. Это действительно нужно выполнить.