2010-03-24 15 views
25

devo tale codice:Javascript: come chiamare il ritorno della funzione esterna dalla funzione interna?

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

    return true; 

} 

che restituisce sempre vero come return false; interessa la funzione interna anonima. C'è un modo semplice per chiamare il ritorno della funzione esterna?

PS. Non sto cercando una soluzione alternativa, voglio solo sapere la risposta alla domanda originale. Se la risposta è "non possibile" va bene.

risposta

15

Sì, memorizzarlo in una variabile locale.

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

    return allGood; 
} 
+4

Quale non è efficiente come se il primo elemento è errato il resto 1000 sarà controllato comunque. – serg

+3

@ serg555: quindi esegui 'return (allGood = false)' all'interno di '.each'. Questo si spezzerà presto. –

+0

@Roatin Marth - È un ciclo di chiusura per elemento, non si comporta come un semplice ciclo, pensa ad esso come a una funzione all'interno di una funzione. –

5

Si può anche fare questo con filtro:

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

Questo funziona perché 0 viene trattato come falso, ma in realtà ti dà il numero di invalido, che si potrebbe usare questo per visualizzare "Si avere 3 voci non valide "o qualcosa del genere se lo si desidera.

1

Se si vuole fare questo in modo efficace, penso che questo sia il modo migliore:

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

Edit: Anche se una versione più JavaScript-y sarebbe probabilmente utilizzare le eccezioni:

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: Grazie per il consiglio di ritorno da .each(). In realtà è documentato, l'ho appena perso. "http://api.jquery.com/each/" – intuited

+6

Non vedo come utilizzare le eccezioni sia più JavaScript-y. Non dovresti mai usare eccezioni per i flussi logici, in qualsiasi linguaggio di programmazione. – bcherry

1

Puoi anche usare Array.prototype.some che itera fino a trovare un elemento che corrisponda ai criteri.

function allValid() { 
    var inputs = $('input'); 
    if(inputs.toArray().some(function(input){ 
     if(something) 
      return true; 
    })) { 
     return false; 
    } else { 
     return true; 
    } 
} 
Problemi correlati