jQuery:如何在不丢失默认参数的情况下将参数添加到回调函数中

Max*_*ard 1 javascript jquery jquery-callback

我有这个代码:

var callbackAfterLoad = function(data, ecBlock) {
    ecBlock.html(data);
    ecBlock.slideDown();
}

function bindevents(userInput, ecBlock, callbackAfterLoad) {
    userInput.keyup(function () {
        delay(function () {
            $.post("/preview", {content:userInput.val()}, callbackAfterLoad(data, ecBlock));
        }, 500);
    });
 }
Run Code Online (Sandbox Code Playgroud)

而这个错误:

Uncaught ReferenceError: data is not defined 
Run Code Online (Sandbox Code Playgroud)

但是当我查看jQuery示例时

$.post("test.php", function(data) {
  alert("Data Loaded: " + data);
});
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?为什么jQuery示例工作而不是我的?(我们不能添加参数?).是否定义了默认的$ .post回调并且他的签名无法覆盖?

Dav*_*ing 6

第三个参数$.post应该是一个函数,但是当你这样做时:

$.post("/preview", {content:userInput.val()}, callbackAfterLoad(data, ecBlock))
Run Code Online (Sandbox Code Playgroud)

第三个参数不是函数,而是函数的返回值.像这样:

fn = callbackAfterLoad   // function reference
fn = callbackAfterLoad() // function execution and return value reference
Run Code Online (Sandbox Code Playgroud)

在您的示例中执行时,data尚不可用.正确的语法是:

$.post("/preview", {content:userInput.val()}, callbackAfterLoad)
Run Code Online (Sandbox Code Playgroud)

如果需要将自定义参数传递给回调,可以创建一个新的代理函数,如下所示:

var callback = function(data) {
    callbackAfterLoad.call(this, data, ecBlock);
};
$.post("/preview", {content:userInput.val()}, callback);
Run Code Online (Sandbox Code Playgroud)