Javascript forEach不像for循环那样向外部函数返回值

Javascript forEach不像for循环那样向外部函数返回值,javascript,Javascript,我试图在我的foreach中输入一个返回值,但它返回未定义的。但当我将相同的if语句放入for循环中时,它返回正确的值。为什么会这样 this.SpriteAndHull.forEach(element => { if (element.name == name) { return element; } }); 使用.forEach()时,您的return语句从传递到forEach回调的函数返回,而不是从外部函数返回 编辑:应该注意的是,从.for

我试图在我的
foreach
中输入一个返回值,但它返回
未定义的
。但当我将相同的
if
语句放入
for循环中时,它返回正确的值。为什么会这样

this.SpriteAndHull.forEach(element => {
      if (element.name == name) {
        return element;
      }
});
使用
.forEach()
时,您的
return
语句从传递到forEach回调的函数返回,而不是从外部函数返回

编辑:应该注意的是,从
.forEach()
函数返回不起任何作用,因为
.forEach()
(按设计)不支持返回值,并且总是返回
未定义的

您可以做的一件事是设置元素,然后返回它,或者简单地使用不同的迭代器函数,如下所示:

function getElementByName(elems, name) {
  let elem;

  elems.forEach(element => {
    if (element.name === name) {
      elem = element;
    }
  });

  return elem;
}
或:


因为
forEach
总是返回
undefined
(实际上),并且它完全忽略回调的返回值(如果有)。您的
返回元素
在回调中,因此被忽略

您可能需要一个
for of
循环:

for (const element of this.SpriteAndHull) {
    if (element.name == name) {
        return element;
    }
}

您需要的是
find

// element will either ben the element that matches the name, or it will be undefined if nothing is found
const element = this.SpriteAndHull.find(el => el.name === name);

for…of
是功能性方法的一个很好的替代方法,可以产生更好的性能+1'd.forEach并不是真正的功能,它只是方法链接。Map/filter/reduce是函数式的,因为它们强调不变性。@badeheuristics是真的,我应该澄清一下,我的意思是函数式的“使用函数进行迭代”,而不是函数式的编程paradigm@mhodges-谢谢。:-)
forEach
的真正性能优势(可能并不重要)是在发现时提前停止。您的
find
解决方案也有同样的好处。@mhodges-是的。当然,从理论上讲,像
for Of
这样的迭代涉及函数调用。但是,除非您对
Array.prototype
,否则我们可以相当肯定JavaScript引擎将在热代码中优化其中的大部分…:-)出于好奇,我如何从回调中获取返回值?@MikeOttink with
.forEach()
您没有。该特定迭代器没有返回值-它总是
未定义的
。但是您可以使用
.filter()
.find()
之类的方法来获取返回值。
// element will either ben the element that matches the name, or it will be undefined if nothing is found
const element = this.SpriteAndHull.find(el => el.name === name);