jQuery:post back-on-success可以是第二个还是第三个参数?

时间:2014-01-25 11:27:13

标签: jquery

我知道如何使用jquery函数,以及jquery如何工作。根据{{​​3}},$.post函数如下所示:

jQuery.post( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )

我相信这没关系:

$.post(url, myOptions, callbackFunctionOnSuccess);

但我的问题是,为什么以下代码有效

$.post(url, callbackFunctionOnSuccess);

不应该是这样的:

$.post(url, null, callbackFunctionOnSuccess);

$.post(url, {}, callbackFunctionOnSuccess);

我相信:jquery检查第二个参数是否是一个函数,然后它认为没有传递选项(数据),并将第二个参数(回调函数)传递给第三个参数。但对于正确的实施,这不是一种奇怪吗?或者真的是一种最佳实践方法?

2 个答案:

答案 0 :(得分:1)

这使得jQuery如此易于使用。此代码可能如下所示:

$.post = function(url, options, successCallback) {
  if (options instanceof Function) {
    successCallback = options;
    options = null;
  }
  //rest of code
}

有时候我会在我的项目中使用这个技巧而且效果很好

修改

这是原始的jQuery(1.11.0)post方法代码:

function ( url, data, callback, type ) {
    // shift arguments if data argument was omitted
    if ( jQuery.isFunction( data ) ) {
        type = type || callback;
        callback = data;
        data = undefined;
    }

    return jQuery.ajax({
        url: url,
        type: method,
        dataType: type,
        data: data,
        success: callback
    });
} 

答案 1 :(得分:1)

通过使用arguments对象,您可以接受函数参数,即使它们未预先定义。

function goHere(a, b) {
    return a + b;
}

如果您尝试将此功能称为goHere(3, 5, 10);,则不会发生任何错误。唯一不同的是,这种情况下的额外参数将被忽略,因为它没有得到解决。

function goHere(a, b) {
    var values;
    for (var i = 0; i < arguments.length; i++) {
        if(typeof arguments[i] === 'string') // Assume this is "url" since it's the only string
        if(typeof arguments[i] === 'object') // Assume this is "data" since it's the only object;
        if(typeof arguments[i] === 'function') //  Assume this is the callback
        values += arguments[i];
    }
    return values;  // For fun.  No real reason.
}

Experience it in 3D

这就是你如何做你所要求的。这里有一个关于这个主题的更轻松的阅读: Function arguments on Javascript.info