2014-01-25 20 views
1

我明白如何使用jquery函數,以及jQuery如何工作。據jquery API$.post功能如下:jQuery:郵政回撥成功可以是第二或第三參數?

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

我相信這是確定:

$.post(url, myOptions, callbackFunctionOnSuccess); 

但我的問題是,爲什麼下面的代碼是有效

$.post(url, callbackFunctionOnSuccess); 

它不應該是這樣的:

$.post(url, null, callbackFunctionOnSuccess); 

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

筆者認爲:jQuery的檢查,如果第二個參數是一個函數,那麼它認爲有沒有選項(數據)通過,並將第二個參數(回調函數)傳遞給第三個參數。但是這種方式不適合正確實施嗎?或者真的是最佳實踐方法?

+1

這只是jQuery如何做到這一點。我敢肯定,你可以找到反對它的論點。 –

+0

@FelixKling所以你說這樣做可以,但這不是最佳做法? – evilReiko

+0

@FelixKling你的簡短評論聽起來像是我的問題的完美答案!請將它作爲答案發布我會選中它 – evilReiko

回答

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 
    }); 
} 
+0

正如你所說,這可能是一種更簡單/更短的方法,但它也可能不太安全! – evilReiko

+0

@evilReiko我認爲這種方法對於那些編寫**代碼的人來說是很好的,但是對於那些閱讀**代碼的人來說可能會感到困惑,特別是如果你不熟悉當前的庫(在我們的例子中是jQuery) – Curious

+0

我與寫/讀代碼類似,但由於我正在開發一個基於jQuery的插件,所以我喜歡玩它安全 – evilReiko

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

相關問題