2012-06-11 52 views
2

我正在使用函數來檢查是否填寫了必填字段。我有這兩個功能,應該這樣做,但第一個功能沒有。在它遇到回報後,JavaScript是否應該停止執行代碼?雖然這一個返回false錯誤返回後執行代碼的JavaScript

//Checks if various stages are ready 
function trnReady(area) { 
    switch (area) 
    { 
     case 'settings': 
      $('input.required').each(function(){ 

       if($(this).val() == '') 
       { 
        return false; 
       } 
      }); 
     break; 
    } 
    return true; 
} 

//Checks if various stages are ready 
function trnReady(area) { 
    var r = true; 
    switch (area) 
    { 
     case 'settings': 
      $('input.required').each(function(){ 

       if($(this).val() == '') 
       { 
        r = false; 
       } 
      }); 
     break; 
    } 
    return r; 
} 

我以爲第一回路將停止執行代碼

該函數返回真的嗎?我想知道它是否與範圍有關?

+1

它不停止執行代碼.. 。但是隻有在你執行了'return'的函數中,這是傳遞給'.each()'的函數。 – 2012-06-11 14:02:42

+0

呼叫者各自不返回函數的返回值:) –

回答

5

在第一個代碼片段return false;停止執行只傳遞給jquery 每個方法的內部函數。它也停止jquery迭代相應的jQuery API。但是在任何情況下,trnReady都會返回true。

第二代碼片段是正確的,但你可以優化它,更換r = false;return r = false;(它將停止jQuery的迭代時,你已經知道,場中的一個未填寫)

+0

謝謝你的優化技巧! – LongInt

2

這些函數中的每一個函數都包含嵌套在其中的第二個函數,它是嵌套函數中您期望生效的返回 - 但它們不會。你不能從內部函數返回到外部函數的調用者。你可以做的最好的事情是在內部函數中設置一個變量,然後像第二個例子那樣從外部函數返回該變量的值。

+0

當然!謝謝,我在這裏盲目地盯着。 – LongInt

1

在第一個示例中,函數返回false,但僅在當前case語句的範圍內。您的false有任何作用,任何操作發生時都不會被調用。

編輯: 返回false僅在您傳遞給.each的匿名函數中有效。

+1

混淆OP的行爲是由'each'中的匿名函數引起的,而不是'case'語句引起的。 – apsillers

3

在第一個片段中,return適用於參數爲each的參數。 return不適用於trnReady函數。因此,return false用於each中的匿名功能。

在第二個片段中,return正確爲trnReady函數的return,所以它工作正常。

1

jQuery each是一個迭代器,它將每個對象傳遞給您定義的函數。

當定義的函數返回true時,迭代繼續(到下一個對象)l 當函數返回false時,迭代停止。

但只有迭代停止

的代碼打break,但在這種情況下要執行的沒有其他return聲明。

相關問題