2010-03-24 3 views
25

У меня есть такой код:Javascript: Как вызвать возврат внешней функции из внутренней функции?

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

    return true; 

} 

, который всегда возвращает истину, как return false; влияет на анонимную внутреннюю функцию. Есть ли простой способ вызова внешней функции?

PS. Я не ищу обходного пути, просто хочу знать ответ на оригинальный вопрос. Если ответ «невозможно», это нормально.

ответ

15

Да, храните его в локальной переменной.

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

    return allGood; 
} 
+4

Это неэффективно, как если бы первый элемент был неправильным, остальные 1000 будут проверяться в любом случае. – serg

+3

@ serg555: then do 'return (allGood = false)' внутри '.each'. Это рано выйдет из цикла. –

+0

@Roatin Marth - это затвор на каждый элемент, он не ведет себя как простой цикл, думает об этом как о функции внутри функции. –

5

Вы также можете сделать это с помощью фильтра:

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

Это работает, потому что 0 интерпретируется как ложь, но это на самом деле дает число недействительных, которые вы могли бы использовать это, чтобы показать «You имеют 3 недействительных записи "или что-то, если хотите.

1

Если вы хотите сделать это эффективно, я думаю, что это лучший способ:

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

Edit: Хотя более JavaScript-у версии, вероятно, использовать исключения:

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: Thanks для подсказки при возврате из .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; 
    } 
} 
Смежные вопросы