如何从内部函数调用外部函数的返回值?

42

我有这样的代码:

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

    return true;
}

由于 return false; 会影响匿名内部函数,所以该函数始终返回 true。是否有一种简单的方法来调用外部函数的返回值?

附注:我不在寻找解决方法,只是想知道原问题的答案。如果答案是“不可能”,那也没关系。

4个回答

23

把它存储在本地变量中。

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

  return allGood;
}

11
如果第一个元素不正确,那么其他 1000 个元素都需要被检查,这不是很高效。 - serg
3
那么在.each内部执行return (allGood = false)。这将提前中断循环。 - Roatin Marth
7
@Nick Craver:.each内部使用return false会打断循环。这是jQuery特意处理的一种情况。参考链接:http://github.com/jquery/jquery/blob/master/src/core.js#L537 - Roatin Marth
7
如果内部函数是异步的(例如回调函数、when/then函数),该怎么办? - 1nfiniti
忽略异步调用,这是一个有效的使用场景。 - Derek Henderson
显示剩余3条评论

5
您也可以使用 Array.prototype.some,它会遍历数组并查找符合条件的元素。
function allValid() {
    var inputs = $('input');
    if(inputs.toArray().some(function(input){
        if(something)
            return true;
    })) {
        return false;
    } else {
        return true;
    }
}

5
您可以使用过滤器来实现此操作:
var anyInvalid = $('input').filter(function(index) {
  if (inValidCheck)
    return true;
}).length;

这是因为0被视为false,但实际上它给出了无效条目的数量,你可以使用它来显示“您有3个无效条目”或其他内容。

3

如果你想高效地完成这件事,我认为以下是最佳方式:

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

编辑:虽然更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;
}

@Roatin Marth:感谢你关于从.each()返回的提示。它实际上已经有文档记录了,我只是没注意到。"http://api.jquery.com/each/" - intuited
7
我不认为使用异常更符合JavaScript的特性。在任何编程语言中,你都不应该使用异常来进行逻辑流程控制。 - bcherry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接