【问题标题】:Why does this ES6 function keep working after `return`? [duplicate]为什么这个 ES6 函数在 `return` 之后继续工作? [复制]
【发布时间】:2020-06-01 23:48:40
【问题描述】:

我正在尝试创建一个简单的函数来检查数组中的所有项目是否有序,但它给了我一些不需要的行为。我想出了这个:

const isArrayInOrder = (array) => {
  let lowNum = Number.NEGATIVE_INFINITY;
  array.forEach((element, index) => {
    if (element < lowNum) {
      console.log("False");
      return false;
    }

    lowNum = element;
  });
  console.log("True!");
  return true;
};

let testArray = [1, 2, 3, 4, 7, 11, 22, 31, 800];
isArrayInOrder(testArray);

let testArray2 = [-800, -30, -5, 0, 10, 55, 200, 2000, 1999];
isArrayInOrder(testArray2);

使用testArray 调用isArrayInOrder() 返回true,正如预期的那样。

用testArray2 调用isArrayInOrder() 会返回false,但随后会意外执行函数底部的console.log("True!") 命令。

在我看来,一旦return false 被击中,应该是函数的结尾,对吧?那么它是如何做到这一点的console.log?

【问题讨论】:

  • .forEach() 方法完全忽略返回值。 return 语句退出 one 函数,即最直接包含它的函数。

标签: javascript function ecmascript-6


【解决方案1】:

你需要明白return会返回到内部函数。

如果你这样做:

const outerFunction = () => {
    const innerFunction = () => {
        return 'inner';
    }

    console.log(innerFunction()); // outputs 'inner';

     return 'outer';
}

console.log(outerFunction()); // outputs 'outer';

你要找的是Array.prototype.every():

const isArrayInOrder = (array) => {
  let lowNum = Number.NEGATIVE_INFINITY;
  return array.every((element, index) => {
    if (element < lowNum) {
      return false;
    } else {
      lowNum = element;
      return true;
    }
  });
};

【讨论】:

  • 我会成为一只腌鹅,我不知道。我怀疑关闭与它有关。谢谢@Elias。
猜你喜欢
  • 2015-06-03
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2020-04-01
相关资源
最近更新 更多