Это потому, что аргумент done
должен быть функцией. Фактический объект функции (напомним, что функции являются «первым классом» в Javascript, что означает, что функция может быть передана другим функциям или возвращена из функции, как любое другое значение) - которая затем будет выполнена, когда ответ Ajax получил.
Кроме того, как и в большинстве языков, аргументы функции, представленные в форме более сложных выражений, должны быть действительно оценены перед вызовом функции. По-видимому, вас это совсем не удивляет, когда вы делаете:
var a = "hello";
var b = "world;
console.log(a + " " + b);
движок JS сначала оценивает выражение a + " " + b
, чтобы получить строку "hello world", которая затем передается в console.log
.
Ну, точно так же происходит и в вашем первом примере:
$.ajax({
url: "RemoveUser",
type: "POST",
data: {
userID: userID
}
}).done(
$('.row').filter(function () {
if ($(this).data()["userID"] === userID) {
return true;
}
}).remove()
);
Здесь аргумент done
должен быть оценен первым - это означает, что весь этот код с .filter
и .remove
выполняется. И это происходит сразу, когда скрипт сначала загружается и запускается. (Это не приводит к функции - возможно, это должно вызвать ошибку, но JS - это язык с динамической типизацией и общеизвестно расслаблен относительно того, что он допустит, не выдавая раннюю ошибку. Я не собираюсь вступать в дискуссию здесь относительно того, хорошо это или плохо - нравится вам это или нет, это просто случается.)
Во втором примере с «функцией-оберткой»:
$.ajax({
url: "RemoveUser",
type: "POST",
data: {
userID: userID
}
}).done(function () {
$('.row').filter(function () {
if ($(this).data()["userID"] === userID) {
return true;
}
}).remove();
});
разница в том, что значение функции фактически передается (поскольку API требует правильной работы), и эта функция еще не выполняется . Аргумент функции является «обратным вызовом», который выполняется после завершения Ajax. Аргумент по-прежнему «оценивается» заранее, так как объект функции (я полагаю) создается как-то внутренне, но код внутри него не выполняется. $.ajax
в jQuery просто принимает этот аргумент функции и выполняет его («перезванивает»), когда настало время.