Подтвердить что ты не робот

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

У меня такой код:

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

    return true;

}

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

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

4b9b3361

Ответ 1

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

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

  return allGood;
}

Ответ 2

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

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

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

Ответ 3

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

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;
}

Ответ 4

Вы также можете использовать Array.prototype.some, который выполняет итерацию, пока не найдет элемент, соответствующий критериям.

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