Javascript函数在返回时不会中断?

Posted

技术标签:

【中文标题】Javascript函数在返回时不会中断?【英文标题】:Javascript function doesn't break on return? 【发布时间】:2014-09-12 07:47:38 【问题描述】:

我知道你应该能够通过返回来打破每个语句,这是我正在尝试做的,但我一定做错了什么,看起来很简单,我找不到它。

我有这样的代码

function create() 
  var test = hasThing();
  if (test) 
    $('#myForm').submit();
   else 
    alert('you suck!')
  


function hasThing() 
  $('.selects').each(function() 
    if (this.value != "") 
      return true;
    
  );
  return false;

我在“return true;”上设置了断点并点击它,但 var test 总是错误的,因为出于某种原因 .each() 循环继续并且 hasThing() 函数继续。我已经尝试过切换,以便我在 .each() 中返回 false 以防万一出于某种重要的原因,但它没有改变任何东西。

我不明白。似乎与文档所说的应该如何工作相反。

【问题讨论】:

打破.each返回false,从each循环内部返回不会从外部函数返回。 Seems counter to how the documentation says it should work. - 文档说“您可以通过返回 false 从回调函数中停止循环”。行为如何不符合文档? 【参考方案1】:

您的return true; 语句从提供给each 的匿名函数返回。 return false; 行总是被执行,这就解释了为什么var test 总是假的。

将您的代码更改为

function hasThing() 
  var hasThing = false;
  $('.selects').each(function() 
    if (this.value != "") 
      hasThing = true;
      return false; // breaks the $.each, but does not return from hasThing()
    
  );
  return hasThing;

【讨论】:

谢谢。这很好地解释了我的错误。【参考方案2】:

您可以使用Array.some() 检查任何选择是否具有选定值

function hasThing() 
    return $('select').toArray().some(function(el) 
        return el.value != "";
    )

function create() 

    var test = hasThing();

    if (test) 
        alert('at least one select was changed');
        //$('#myForm').submit();
     else 
        alert('you suck!');
    


function hasThing() 
	return $('select').toArray().some(function(el) 
    	return el.value != "";
    )
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Select at least one option !</p>
<form id="myForm">
    <select class="selects">
        <option value="">blank</option>
        <option value="2">option1</option>
    </select>
    
    <select class="selects">
        <option value="">blank</option>
        <option value="2">option1</option>
    </select>
    
    <input type="button" onclick="create()" value="submit" />
    
</form>

【讨论】:

更容易阅读(因此也更容易维护),尽管效率可能低得多,因为其他建议支持“短路”。取决于this.value = 逻辑的实际复杂程度以及匹配的元素数量。希望香草 jQuery 有一个“.any()”函数。 @JDB - 确实如此,Array.some,但是必须将这些值映射到一个数组,它实际上并没有效率更高,在这里使用过滤器应该不是问题。 多哈。平均而言,这将为您节省一半的计算周期(和时间),并且实施起来不会特别困难。 @JDB - 我看不出来,它看起来像 -> jsfiddle.net/Lxg4k/1 ...[].some.call($('.selects'), function(e) return !!e.value; ) ?? (或者当然是$.trim()

以上是关于Javascript函数在返回时不会中断?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 方法执行中断

调用 NSManagedObject 函数会中断,但在访问变量时不会中断

前端面试 JavaScript— forEach中return有效果吗?如何中断forEach循环?

前端面试 JavaScript— forEach中return有效果吗?如何中断forEach循环?

JavaScript学习系列博客_16_JavaScript中的函数的参数返回值

经典试题