2014-01-30 144 views
1

我使用checkForm函數來驗證一個簡單的表單。當用戶按提交時,運行checkForm。第一個和第二個例子有什麼區別?調用函數和返回函數有什麼區別?

例1

$('form').submit(function(){ 
    checkForm(); 
}); 

例2

$('form').submit(function(){ 
    return checkForm(); 
}); 
+0

'checkForm()'返回什麼? – Satpal

+0

在事件處理函數中,你可以返回'true'或'false',後者在jQuery中結合'preventDefault'和'stopPropagation',停止表單提交,所以如果checkForm()函數返回false,沒有被提交,如果它返回'true'表單被提交等。 – adeneo

+3

在例2中,你沒有返回一個函數,而是返回執行該函數的結果。返回一個函數看起來像這樣:'return checkForm;'。當然,在這種情況下這沒有意義,但我認爲這種區別很重要。 –

回答

4

在第二個例子中,你實際上並不返回功能而是已執行該功能的結果。 (考慮到代碼從右到左在這種情況下執行)

爲了說明這一點,稍微改變你的第一個例子:

$('form').submit(function(){ 
    var result = checkForm(); 
}); 

正如你所看到的,執行功能和結果從函數返回。這只是沒有結果。隨着匿名功能的完成,它立即超出範圍,逐漸淡入古代。

稍微修改第二個例子來進一步說明:

$('form').submit(function(){ 
    var result = checkForm(); 
    return result; 
}); 

正如第一實施例,checkForm被執行,且其結果存儲在變量中。然後,該值從匿名函數返回。當然,這個過程可以在襯裏,使得不需要臨時變量:

$('form').submit(function(){ 
    return checkForm(); 
}); 

操作的順序不改變,checkForm被執行,返回一個結果,並且該結果是從返回匿名功能。

可以返回函數本身,具有不實際執行它:

$('form').submit(function(){ 
    return checkForm; 
}); 

由於函數是「一等公民」在JavaScript中,可以像任何其他變量那樣來傳遞,這將返回一個實際的功能,而不是功能的結果。假定調用代碼可能最終會執行該函數。然而,在這種情況下(一個submit處理程序),這當然是沒有意義的,因爲它期望一個布爾值而不是函數。

+0

感謝您的詳細解答,它真正澄清了區別。 – Operator

2

在你的代碼的主要區別是,在第一種情況下,你只要運行驗證,並在第二種情況下,如果您的驗證將返回布爾值將阻止表單提交。

因此,在第一種情況下,您的表單將每次提交,即使checkForm()將返回false。在第二種情況下,如果checkForm()將返回true您的表單將被提交,如果它將返回false它將阻止表單提交。

所以基本上承擔checkForm()返回false,你的函數將在第一個例子是:

$('form').submit(function(){ 
    false; 
}); 

並在第二個例子:

$('form').submit(function(){ 
    return false; 
}); 
+0

感謝您的回答,所以我注意到了。但是checkForm函數怎麼不自己處理呢?爲了防止在虛假價值的情況下提交,我們如何返回函數? – Operator

+0

你不會在你的例子中返回函數,你正在返回函數結果。所以如果你添加'()'到你的函數名稱,它就會被調用。即使你在函數內部有'return'語句,這也不會阻止表單提交,直到'submit'方法中有'return'語句。 – antyrat

+0

@操作員看到我更新的答案 – antyrat

相關問題