我知道如何使用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检查第二个参数是否是一个函数,然后它认为没有传递选项(数据),并将第二个参数(回调函数)传递给第三个参数。但对于正确的实施,这不是一种奇怪吗?或者真的是一种最佳实践方法?
答案 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.
}
这就是你如何做你所要求的。这里有一个关于这个主题的更轻松的阅读: Function arguments on Javascript.info