2010-03-24 230 views
25

我有這樣的代碼:Javascript:如何調用外部函數從內部函數返回?

function allValid() { 
    $('input').each(function(index) { 
     if(something) { 
      return false; 
     }  
    }); 

    return true; 

} 

return false;影響匿名的內部函數,它總是返回true。有沒有簡單的方法來調用外部函數的返回?

PS。我不是在尋找解決方法,只想知道原始問題的答案。如果答案是「不可能的」,那很好。

回答

15

是的,存儲在一個局部變量。

function allValid() { 
    var allGood = true; 
    $('input').each(function (index) { 
    if (something) { 
     allGood = false; 
    } 
    }); 

    return allGood; 
} 
+4

哪一個效率不高,就好像第一個元素不正確,其餘的1000會被檢查。 – serg

+3

@ serg555:然後在'.each'裏面執行'return(allGood = false)'。這將盡早擺脫循環。 –

+0

@Roatin Marth - 它是每個元素的閉包運行,它不像簡單循環那樣表現,把它看作是一個函數內部的函數。 –

5

您還可以使用過濾器做到這一點:

var anyInvalid = $('input').filter(function(index) { 
        if(inValidCheck) 
        return true; 
       }).length; 

這工作,因爲0被認爲是假的,但它實際上給你無效,你可以使用它來顯示「你的號碼有3個無效的條目「或者如果你想要的東西。

1

如果要有效地做到這一點,我覺得這是最好的方法:

function allValid() { 
    elements = $('input') 
    for (i = 0; i < elements.length; i++) { invalidityCheck(elements[i]) && return false; } 
    return true; 
} 

編輯:雖然更多的JavaScript-Y版本可能會使用的例外:

function allValid() { 
    try 
    $('input').each(function(index)) { 
     if (something) { throw 'something happened!'; } 
    }); 
    catch (e) { 
    if (e == 'something happened!') { 
     return false; 
    } else { 
     throw e; 
    } 
    } 
    return true; 
} 
+0

@Roatin Marth:謝謝從.each()返回的提示。它實際上有記錄,我只是錯過了。 「http://api.jquery.com/each/」 – intuited

+6

我不明白如何使用異常更多JavaScript-y。在任何編程語言中,您都不應該使用邏輯流的異常。 – bcherry

1

您也可以使用迭代的Array.prototype.some,直到找到與條件匹配的元素。

function allValid() { 
    var inputs = $('input'); 
    if(inputs.toArray().some(function(input){ 
     if(something) 
      return true; 
    })) { 
     return false; 
    } else { 
     return true; 
    } 
} 
相關問題